c# - ASP.NET Core WebApi Jwt 基于角色的授权不起作用

标签 c# asp.net-core jwt asp.net-core-webapi

我已经根据教程实现了 JWT 身份验证/授权系统。

但不幸的是我不知道如何授权这些角色。

这是基于角色的授权。

    public class InfoController : ControllerBase
    {
        [Authorize(Roles = "User")]
        [HttpGet("user")]
        public IActionResult UserInfo()
        {
            return Ok("User role");
        }
    }

当我调用此 api/Info/user 时,我得到 401 响应代码而不是具有“用户角色”的状态代码 200信息。所以基于角色的授权不起作用。 我用正确的数据调用它:

curl -X GET "https://localhost:34545/api/Info/user" -H  "accept: application/json" -H  "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZXN0IiwianRpIjoiYTgwYzQ3NDQtNmYyZC00ZTAwLThhYjItMzY2MTRmYTNmMzYzIiwiaWF0IjoxNTU3NjgyMDU4LCJyb2wiOiJ3ZWItYXBpLWFjYyIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IlVzZXIiLCJuYmYiOjE1NTc2ODIwNTgsImV4cCI6MTU1NzY4OTI1OCwiaXNzIjoid2ViLWFwaSIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjQ0MzUwLyJ9.8uRAOsSXmKeWcYCwvN0sNFX02GNoZMaPNf6RPGkQE4E"

在启动时我有以下配置:

services.AddAuthorization(options =>
        {
            options.AddPolicy("api", policy => policy.RequireClaim(
               jwtClaimConfiguration[nameof(JwtClaimOptions.Rol)],
               jwtClaimConfiguration[nameof(JwtClaimOptions.ApiAccess)]
            ));
            options.AddPolicy("user", policy => policy.RequireRole(AppRole.USER));
            options.AddPolicy("admin", policy => policy.RequireRole(AppRole.ADMIN));
        });

这里是生成Jwt的地方(我在这里看到过StackOverflow这个解决方案)

 public async Task<string> GenerateEncodedTokenAsync(string userName, ClaimsIdentity claimsIdentity)
        {
            List<Claim> claims = new List<Claim>()
            {
                 new Claim(JwtRegisteredClaimNames.Sub, userName),
                 new Claim(JwtRegisteredClaimNames.Jti, await jwtOptions.JtiGenerator()),
                 new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
                 claimsIdentity.FindFirst(jwtClaimConfiguration[nameof(JwtClaimOptions.Rol)]),
                 claimsIdentity.FindFirst(jwtClaimConfiguration[nameof(JwtClaimOptions.ApiAccess)])
             };
            var user = await userManager.FindByNameAsync(userName);
            var roles = await userManager.GetRolesAsync(user);

            claims.AddRange(roles.Select(role => new Claim(ClaimsIdentity.DefaultRoleClaimType, role)));

            JwtSecurityToken jwt = new JwtSecurityToken(
                issuer: jwtOptions.Issuer,
                audience: jwtOptions.Audience,
                notBefore: jwtOptions.NotBefore,
                expires: jwtOptions.Expiration,
                signingCredentials: jwtOptions.SigningCredentials,
                claims: claims
            );

            return new JwtSecurityTokenHandler().WriteToken(jwt);
        }

Jwt token 包含角色!这是有效载荷,如您所见,已添加角色,用户具有“用户”角色。:

{
  "sub": "demo",
  "jti": "a80c4744-6f2d-4e00-8ab2-36614fa3f363",
  "iat": 1557682058,
  "rol": "acc",
  "http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "User",
  "nbf": 1557682058,
  "exp": 1557689258,
  "iss": "api",
  "aud": "https://localhost:34545/"
}

最佳答案

请正确订购中间件

 first =>  app.UseRouting();
 second => app.UseAuthentication();
 third=>  app.UseAuthorization();

关于c# - ASP.NET Core WebApi Jwt 基于角色的授权不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101873/

相关文章:

c# - 允许用户删除我的应用程序正在使用的文件?

c# - Request.Url.AbsoluteUri 在 asp.net core 2.0 中不起作用(使用 System.Web)

oauth-2.0 - 隐式授权工作流程的缺点与授权代码授权仅用于身份验证?

c# - 按 x 分组总和性能(VB.Net --> C#).net Core 2.0

jwt - asp.net core 2.0登录请求的400状态

.net-core - 如何从.netcore中的 token 中删除“http ://schemas. xmlsoap.org/ws/2005/05/identity/urls

c# - SPNavigationNode.IsVisible 属性未按预期在共享点中工作

c# - 屏幕阅读器阅读禁用按钮的 AutomationProperty.Id

c# - 将部分 viewModel 发布到发布操作方法

json - .NET Core 中的强类型配置忽略 JsonProperty 属性