我有一个使用 JWT 进行授权的 ASP.NET Core 2.0 项目。
事情是这样的:
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, user.UserName));
claims.Add(new Claim(JwtRegisteredClaimNames.Sub, user.Email));
claims.Add(new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()));
var roles = await _userManager.GetRolesAsync(user);
foreach(var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
进一步根据角色,授权系统必须工作。
据我了解,在这种情况下,JWT 的优势之一是用户的信息,包括他的角色,不需要从数据库中拉出,而是通过解密 JWT 令牌获得。
如果我写
[Authorize(Roles = "Moderator")]
public MaterialViewModel GetMaterial(int i)
然后一切都按预期工作,没有主持人角色的用户无法完成此请求。
以及如何在不进入数据库的情况下找出用户的角色?使用 JWT 令牌。
我可以像这样获得用户的所有角色:
_userManager.GetRolesAsync(user);
但据我了解(也许我错了)有一个对数据库的请求。
但是理论上角色的信息已经在token里面了,现在怎么获取呢?
我的 JWT 令牌是通过标头传递的,当然我可以将其放入request.headers并手动解密,但 ASP.NET Core 系统在检查[Authorize(Roles = "Moderator")]. 所以我可以在已经解密的地方得到它?
以这种方式找到:
this.User.Claims包含来自 JWT 的所有令牌。所有带钥匙的邮票分配一个角色。
我不知道这种方法有多优化,为什么没有这样的方法
User.GetRoles()