【问题标题】:JWT Authentication by role claims in ASP.NET core Identity通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证
【发布时间】:2018-08-31 18:43:11
【问题描述】:

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

Startup.cs:

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

在登录控制器中我有:

    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 在令牌中搜索声明,而不是在角色中。

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

【问题讨论】:

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


    【解决方案1】:

    要将角色添加到声明中,您需要使用声明类型角色,如下所示:

    var rolesList = new List<string>
        {
         "Admin",
         "SuperUser",
         "Etc..."
        };
    
    
    foreach (var role in rolesList)
        {
         claims.Add(new Claim(ClaimTypes.Role, role));
        }
    

    注意:- 在创建令牌时确保添加声明。

    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 属性测试令牌是否包含角色“Admin”。

       [Authorize(Roles="Admin")]
    

    注意:- 测试多个角色(令牌包含声明“管理员”或“超级用户”)

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

    如下@gentiane 指出的编辑

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

    【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2019-03-26
    • 2018-11-10
    • 2020-03-14
    • 2017-01-04
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多