c# - ASP.NET 核心身份中通过角色声明进行的 JWT 身份验证

标签 c# asp.net-core asp.net-identity jwt asp.net-core-webapi

如何通过包含在用户角色中的声明对用户进行身份验证?

Startup.cs中:

services.AddAuthorization(options => {
                options.AddPolicy("CanEdit", policy => policy.RequireClaim("CanEdit"));    
});

在登录 Controller 中我有:

    private async ValueTask<JwtSecurityToken> GetJwtSecurityToken(ApplicationUser user){
        //var totalClaims = new List<Claim>();
        //var userRoles = await _userManager.GetRolesAsync(user);
        //foreach (var role in userRoles) {
        //    var roleClaims = await _roleManager.GetClaimsAsync(await _roleManager.Roles.SingleAsync(r => r.Name.Equals(role)));
        //    totalClaims.AddRange(roleClaims);
        //}
        var claims = new List<Claim>
        {
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
            new Claim(JwtRegisteredClaimNames.Email, user.Email)
        };
        return new JwtSecurityToken(
            _configuration["Token:Issuer"],
            _configuration["Token:Audience"],
            //totalClaims,
            claims
            expires: DateTime.UtcNow.AddHours(12),
            signingCredentials: new SigningCredentials(
                new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Token:Key"])),
                SecurityAlgorithms.HmacSha256)
        );
    }

方法 policy.RequireClaim 在 token 中搜索声明,而不是在角色中。

当我取消注释这些行时,它起作用了。 这是一个好的解决方案吗?

最佳答案

要向声明添加角色,您需要使用声明类型 Role,如下所示:

var rolesList = new List<string>
    {
     "Admin",
     "SuperUser",
     "Etc..."
    };


foreach (var role in rolesList)
    {
     claims.Add(new Claim(ClaimTypes.Role, role));
    }

注意:- 创建 token 时确保添加声明。

var Token = new JwtSecurityToken(
    issuer: "localhost",
    audience: "localhost",
    expires: DateTime.Now.AddMinutes(10),
    claims:claims //claims added to token here!
    signingCredentials: Creds);
    return new JwtSecurityTokenHandler().WriteToken(Token);
    }

就是这样,现在您可以通过 Authorize 属性测试 token 是否包含角色“Admin”。

   [Authorize(Roles="Admin")]

注意:- 针对多个角色进行测试( token 包含声明“Admin”或“SuperUser”)

  [Authorize(Roles="Admin","SuperUser")]

按照下面@gentiane 指出的进行编辑

  [Authorize(Roles="Admin,SuperUser")] 

关于c# - ASP.NET 核心身份中通过角色声明进行的 JWT 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426781/

相关文章:

css - Asp.Net 标识 : Edit default layout

c# - 插入 SQL Server CE 数据库文件并返回插入的 id

c# - C#计时器在循环期间抛出错误?

authentication - AddAuthentication 和 AddAuthenticationCore 有什么区别?

c# - 如何在 C# .NET Core 中测试查询的执行时间

c# - ASP.NET Identity UserManager 缓存用户?

c# - 访问通用实例属性

c# - 未使用 LockScreen.SetImageFileAsync(file) 更新缓存图像;

c# - 在 ASP.NET Core 中使用 WebGrid

c# - 如何使用 MongoDB 实现 ASP.NET Core 3.1 Identity?