为什么使用 User.IsInRole() 总是返回 false?

Why does using User.IsInRole() always return false?

提问人:đạo bảnh 提问时间:10/30/2023 最后编辑:Qing Guođạo bảnh 更新时间:10/31/2023 访问量:93

问:

我使用 User.IsInRole() 检查登录后,具有管理员角色的用户将直接进入管理员页面,如果他们没有管理员角色,他们将转到另一个页面。但是,User.IsInRole() 始终返回 false[enter image description here](https://i.stack.imgur.com/x6ef1.png)

   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);
       }

我想用它来检查登录后,具有管理员角色的用户是否会立即转到管理员页面

C# asp.net ASP.NET Core 标识

评论

0赞 Rand Random 10/30/2023
不应该是 Administrators(注意复数形式)吗?
0赞 đạo bảnh 10/30/2023
不,我检查一下,是“管理员”

答:

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);