【发布时间】:2023-03-19 00:12:01
【问题描述】:
我已经成功地让 JWT 令牌身份验证在我的 API 上运行,但是,我正在努力将角色声明集成到身份验证过程中。
我想要实现的是能够将以下内容添加到我的控制器中的调用中,并让网站自动针对经过身份验证的用户检查角色声明:
[Authorize(Roles = "SiteAdmin")]
这是生成 JWT Token 的代码:
private string GenerateJwtToken(UserDto user)
{
// generate token that is valid for 7 days
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[] { new Claim("userAccountId", user.UserAccountId.ToString()) }),
Expires = DateTime.UtcNow.AddHours(_appSettings.JwtExpiryHours),
SigningCredentials =
new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
我已尝试在此处遵循本指南 (https://www.jerriepelser.com/blog/using-roles-with-the-jwt-middleware/),并将上述功能更改为以下内容:
private async Task<string> GenerateJwtToken(UserDto user)
{
// generate token that is valid for 7 days
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[] { new Claim("userAccountId", user.UserAccountId.ToString()) }),
Expires = DateTime.UtcNow.AddHours(_appSettings.JwtExpiryHours),
SigningCredentials =
new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
Claims = await FetchClaims(user.UserAccountId)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
private async Task<Dictionary<string, object>> FetchClaims(int userId)
{
var userPermissions = await GetUserPermissionsByUserId(userId);
var userClaims = new Dictionary<string, object>();
foreach (var userPermission in userPermissions)
{
userClaims.Add("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", userPermission.PermissionName);
}
return userClaims;
}
虽然从理论上讲,上述内容在我的脑海中是有道理的,但我不能添加多个角色声明,因为在向字典中添加 userClaim 时,它会添加一个重复的键。
我一定是误解了这个实现是如何工作的,任何帮助都将不胜感激。
【问题讨论】:
-
您添加了角色声明,但值看起来像权限?这令人困惑。您可以尝试通过逗号分隔的角色名称添加多个角色(当然,用户声明角色只有一个键)。
标签: c# asp.net-core jwt