通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证
Posted
技术标签:
【中文标题】通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证【英文标题】:JWT Authentication by role claims in ASP.NET core Identity 【发布时间】: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
在令牌中搜索声明,而不是在角色中。
当我取消注释这些行时,它可以工作。 这是一个好的解决方案吗?
【问题讨论】:
【参考方案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")]
【讨论】:
你能在这里看看我的问题吗:***.com/questions/53194947/…? 有点错别字,是[Authorize(Roles="Admin,SuperUser")]
以上是关于通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 身份中的角色声明与自定义身份验证中的角色权限相比
Missed User 属性,用于计算 asp.net 核心身份中的用户/角色数