我正在玩asp.net核心实现一个小的WEB API,它将被iOS/Android应用程序使用。我使用JWT令牌来授权用户。我正在添加一个
role
用户登录时声明,确定用户在发布JWT时是管理员还是普通用户,我正在使用
[Authorize(Role = '...')]
属性,以确保某些端点仅可用于相应的角色。到目前为止,这工作得很好。
创建JWT的代码如下(缩短):
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, m_configuration["Jwt:Subject"]),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()),
new Claim("Id", user.Id.ToString()),
new Claim("FirstName", user.FirstName),
new Claim("LastName", user.LastName),
new Claim("UserName", user.UserName),
new Claim("role", user.IsAdmin ? "Admin" : "User"),
new Claim("EMail", user.EMail)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(m_configuration["Jwt:Key"]));
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
return new JwtSecurityToken(m_configuration["Jwt:Issuer"], m_configuration["Jwt:Audience"], claims, expires: expiration, signingCredentials: signingCredentials);
但我想知道:
我想允许管理员向其他用户授予/撤销管理员权限。目前,服务端默认从JWT确定管理员状态。我如何让它识别出用户实际上是管理员/不再是管理员,即使JWT说了别的什么?
在我刷新他们的JWT之前,我认为没有机会这样做,但这似乎不是一个好方法。在服务端的“链”中,我是否可以动态地确定JWT用户的角色并添加相应的角色,从而跳过
角色
首先,索赔?