我有一个使用JWT承载认证的web api。现在我想知道如何使用asp.net核心上的JWT令牌实现基于角色的授权。我使用基于角色的授权尝试了此aritcle但我没有得到很多帮助。
有没有人有一篇好文章来研究或提供有关如何实施基于角色的授权的代码?
感谢。
答案 0 :(得分:1)
抱歉,我丢失了此帐户的密码,但我已经有了如何使用JWT令牌承载实现角色基本授权的解决方案。
var user = _userRepository.CheckLogin(login);
if (user.UserID > 0)
{
var _userManager = HttpContext.User.Claims;
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Token:SecretKey"]));
var credentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha512);
var claims = new[] {
new Claim(JwtRegisteredClaimNames.UniqueName, user.Username), // ClaimType.Name
new Claim(JwtRegisteredClaimNames.Email, user.EmailAddress), // ClaimType.EmailAddress
new Claim(JwtRegisteredClaimNames.NameId, user.UserID.ToString()), // ClaimType.NameIdentifier
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), // jti
new Claim(JwtRegisteredClaimNames.Actort, user.UserKey), // ClaimType.Actor
new Claim(ClaimTypes.Role, user.Type) // ClaimType.Role add role for authorization.
};
var stringToken = new JwtSecurityToken(
_configuration["Token:Issuer"],
_configuration["Token:Issuer"],
claims,
expires: DateTime.Now.AddMinutes(Convert.ToInt32(_configuration["Token:ExpirationMinutes"])),
notBefore: DateTime.Now,
signingCredentials: credentials
);
var userToken = new JwtSecurityTokenHandler().WriteToken(stringToken);
return Ok(new { token = userToken });
}
在声明列表中添加ClaimTypes.Role
将解决此问题,现在您可以使用[Authorize(Roles = "???")]
到控制器了。
我希望这会帮助那些使用JWT Bearer身份验证添加角色的人。
答案 1 :(得分:-2)
我已经使用带有自定义表的asp.net核心上的JWT令牌实现了基于角色的授权。我放置了示例工作source code on Github,并在detail on medium中进行了解释。
希望有帮助。