提问人:đạo bảnh 提问时间:10/30/2023 最后编辑:Qing Guođạo bảnh 更新时间:10/31/2023 访问量:93
为什么使用 User.IsInRole() 总是返回 false?
Why does using User.IsInRole() always return false?
问:
我使用 User.IsInRole() 检查登录后,具有管理员角色的用户将直接进入管理员页面,如果他们没有管理员角色,他们将转到另一个页面。但是,User.IsInRole() 始终返回 false
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
UserManager<AppUser> usermanager;
if (User.IsInRole("Administrator")||User.IsInRole("Admin"))
{
return RedirectToAction("Index", "Tours", new { area = "Admin" });
}
else
{
return RedirectToPage(returnUrl);
}
我想用它来检查登录后,具有管理员角色的用户是否会立即转到管理员页面
答:
0赞
Qing Guo
10/30/2023
#1
为什么使用 User.IsInRole() 总是返回 false
当用户使用其用户名和密码进行身份验证并成功登录时,系统会向他们颁发一个令牌,其中包含可用于身份验证和授权的身份验证票证。令牌存储为 cookie,随客户端发出的每个请求一起发送。生成和验证此 cookie 由 Cookie 身份验证中间件执行。中间件将用户主体序列化为加密的 Cookie。在后续请求中,中间件将验证 cookie,重新创建主体,并将主体分配给属性。User
成功登录(完成登录操作,而不是在当前登录 post 操作中)后,在后续请求中,您将在另一个 Authorize 操作中获得 User.IsInRole()。这就是为什么使用 User.IsInRole() 总是返回 false 的原因。
我使用 User.IsInRole() 检查登录后,具有 admin 角色将直接进入 admin 页面,
您可以尝试使用 UserManager.IsInRoleAsync(TUser, String) 方法来检查用户角色,例如:
if (await userManager.IsInRoleAsync(appUser, "Administrator")||await userManager.IsInRoleAsync(appUser, "Admin"))
{
return RedirectToAction("Index", "Tours", new { area = "Admin" });
}
评论
0赞
đạo bảnh
10/30/2023
我尝试和你做同样的事情,但是当我使用管理员帐户登录时,第一次用户将为空,第二次登录时会说无法访问该页面,第三次将能够访问该页面。admin. admin
0赞
Qing Guo
10/31/2023
@đạobảnh 在我的解释中,我说,'在后续请求中,您将在另一个 Authorize 操作中获得 User.IsInRole()。这就是为什么使用 User.IsInRole() 总是返回 false 的原因。
0赞
đạo bảnh
10/31/2023
那么有没有办法直接登录管理页面呢?我这样做了,但仍然必须登录 3 次--------- var user = await _userManager.GetUserAsync(User);if (user != null) { var isAdmin = await _userManager.IsInRoleAsync(user, “Administrator”) || await _userManager.IsInRoleAsync(user, “Admin”); if (isAdmin) { return RedirectToAction(“Index”, “Tours”, new { area = “Admin” }); } else { return RedirectToPage(returnUrl); } } ---------
0赞
Qing Guo
10/31/2023
@đạobảnh 您是否在 ?isAdmin的价值是什么?var isAdmin = await _userManager.IsInRoleAsync(user, "Administrator") || await _userManager.IsInRoleAsync(user, "Admin");
1赞
Amit Mohanty
10/30/2023
#2
除了使用 ,您还可以使用 来检查角色。User.IsInRole()
UserManager
var user = await _userManager.GetUserAsync(User);
if (user != null)
{
var isAdmin = await _userManager.IsInRoleAsync(user, "Administrator") || await _userManager.IsInRoleAsync(user, "Admin");
if (isAdmin)
{
return RedirectToAction("Index", "Tours", new { area = "Admin" });
}
else
{
return RedirectToPage(returnUrl);
}
}
评论
0赞
Qing Guo
10/30/2023
这个方法:userManager.IsInRoleAsync在我的回答中已经介绍过了,我的回答比你的早。
0赞
Amit Mohanty
10/30/2023
Qing Guo
: 好的,那就好好享受吧。
0赞
đạo bảnh
10/30/2023
我尝试和你做同样的事情,但是当我使用管理员帐户登录时,第一次用户将为空,第二次登录时会说无法访问该页面,第三次将能够访问该页面。admin. admin
0赞
Ozan BAYRAM
10/30/2023
#3
您是否正在将角色添加为声明?
这是我在项目中使用的方式:
// set default claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.Email, user.Username),
new Claim(ClaimTypes.Name, user.Name),
new Claim(CustomClaimTypes.UserId, user._id.ToString())
};
// set user role claims
foreach (var roleName in user.Roles)
{
Claim roleClaim = new Claim(ClaimTypes.Role, roleName);
claims.Add(roleClaim);
}
var claimsIdentity = new ClaimsIdentity(
claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
//AllowRefresh = <bool>,
// Refreshing the authentication session should be allowed.
ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(120),
// The time at which the authentication ticket expires. A
// value set here overrides the ExpireTimeSpan option of
// CookieAuthenticationOptions set with AddCookie.
IsPersistent = Input.RememberMe,
// Whether the authentication session is persisted across
// multiple requests. Required when setting the
// ExpireTimeSpan option of CookieAuthenticationOptions
// set with AddCookie. Also required when setting
// ExpiresUtc.
IssuedUtc = DateTimeOffset.UtcNow,
// The time at which the authentication ticket was issued.
//RedirectUri = <string>
// The full path or absolute URI to be used as an http
// redirect response value.
};
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
评论