为何User.IsInRole()始终返回false?登录角色跳转异常
解决User.IsInRole()始终返回false的角色跳转问题
问题原因
登录成功后直接调用User.IsInRole()会返回false,是因为PasswordSignInAsync执行完成后,当前HttpContext.User的身份信息还未更新,此时无法正确读取用户的角色数据。另外你代码中声明的UserManager<AppUser> usermanager未实例化,也没有实际用于角色判断。
解决方案
方法1:通过UserManager直接验证用户角色
依赖注入UserManager<AppUser>,登录成功后获取用户实例,直接用UserManager检查角色:
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { // 获取当前登录用户实例 var user = await _userManager.FindByEmailAsync(Input.Email); // 验证用户是否拥有管理员角色 bool isAdmin = await _userManager.IsInRoleAsync(user, "Administrator") || await _userManager.IsInRoleAsync(user, "Admin"); if (isAdmin) { return RedirectToAction("Index", "Tours", new { area = "Admin" }); } else { return RedirectToPage(returnUrl); } }
方法2:重新登录用户更新HttpContext.User
如果坚持使用User.IsInRole(),可以在登录成功后调用SignInAsync重新写入身份信息,确保HttpContext.User更新:
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { var user = await _userManager.FindByEmailAsync(Input.Email); // 重新登录以更新HttpContext中的用户身份 await _signInManager.SignInAsync(user, Input.RememberMe); if (User.IsInRole("Administrator") || User.IsInRole("Admin")) { return RedirectToAction("Index", "Tours", new { area = "Admin" }); } else { return RedirectToPage(returnUrl); } }
额外检查项
- 确保
AppUser类正确继承自IdentityUser - 验证数据库中
AspNetUserRoles表是否存在用户与"Administrator"/"Admin"角色的关联记录 - 启动配置中已正确启用角色支持,例如:
services.AddDefaultIdentity<AppUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<IdentityRole>() // 添加角色支持 .AddEntityFrameworkStores<ApplicationDbContext>();
内容的提问来源于stack exchange,提问作者đạo bảnh
相关产品推荐
相关产品推荐

