【问题标题】:Role-based Authentication ASP.NET Core基于角色的身份验证 ASP.NET Core
【发布时间】:2018-09-06 14:12:27
【问题描述】:

我有一个使用 JWT 承载身份验证的 web api。现在我想知道如何在 asp.net core 上使用 JWT 令牌实现基于角色的授权。我使用基于角色的授权尝试了这个aritcle,但没有得到太多帮助。

谁有关于如何实现基于角色的授权的好文章或示例代码来学习?

谢谢。

【问题讨论】:

  • 索取教程通常被视为 SO 题外话。最好直接问你不明白什么或什么不起作用。

标签: asp.net asp.net-web-api asp.net-core jwt roles


【解决方案1】:

我已经在带有自定义表的 asp.net 核心上使用 JWT 令牌实现了基于角色的授权。我已经放置了示例工作 source code on Github 并在 detail on medium 中解释了这一点。

希望对你有帮助。

【讨论】:

  • @IvanKaloyanov 在阅读指南后,我试图改进我的答案。请查看并说明是否仍需要任何改进。
【解决方案2】:

抱歉,我丢失了此帐户的密码,但我已经有了如何使用 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 身份验证添加角色的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 2018-06-23
    • 2016-01-03
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2019-10-10
    相关资源
    最近更新 更多