如何解决始终返回使用 [Authorize(Roles = "Manager")] 的未经授权状态?

Posted

技术标签:

【中文标题】如何解决始终返回使用 [Authorize(Roles = "Manager")] 的未经授权状态?【英文标题】:How to fix always returning unathorized status of using [Authorize(Roles = "Manager")]? 【发布时间】:2019-06-17 18:31:26 【问题描述】:

我正在为 asp.net core webapi 实现基于角色的身份验证。我几乎遵循了这个教程。 https://medium.com/@engr.mmohsin/asp-net-core-2-0-webapi-jwt-role-based-authentication-authorization-with-custom-tables-and-identity-401c898d9ef1

我用管理账户[Authorize(Roles = "Manager")]登录后总是未经授权返回。

在控制器类中

[Route("api/[controller]")]
[Authorize(Roles = "Manager")]

在服务类的登录方法中生成令牌

var claims = new[] 

    new Claim("Name", user.Name), 
    //few other claims
    new Claim(ClaimTypes.Role, user.Role.ToString())


        ;
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));

var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(_config["Jwt:Issuer"],
          _config["Jwt:Issuer"],
          claims,
          expires: DateTime.Now.AddMinutes(30),
          signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);

在startup.cs中

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    
        options.TokenValidationParameters = new TokenValidationParameters
        
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
        ;
    );

有人,请解释一下这段代码的问题是什么?

HTTP 请求

已解决:发生这种情况没有到达代码 app.UseAuthentication()

【问题讨论】:

【参考方案1】:

您的代码看起来不错。当您在 HTTP 请求的标头中发送令牌时。您是否附加了授权类型?

您需要在 HTTP 请求的标头中添加授权类型 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization

在此处检查身份验证方案 http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml

您需要的是承载认证方案。您可以阅读此链接以获取有关详细信息的更多信息 https://www.rfc-editor.org/rfc/rfc6750#section-2.1

所以,您的授权标头看起来像

httpClient.DefaultHeaders.Add("Authorization", "Bearer " + your token);

你可以通过像这样使用它来让它与你当前的设置一起工作

[Authorize("Bearer", (Roles = "Manager")]

【讨论】:

感谢您的回答。是的,我正在发送带有 http 请求的授权类型。 (刚刚添加了一张图片来提问)。 [Authorize("Bearer", (Roles = "Manager")] dosen't work 给了我一个例外。 什么异常,它给出了吗?您是否尝试过不使用角色管理器部分? [授权(“承载”)]【参考方案2】:

对不起,我太笨了。 这个问题的原因是没有使用app.UseAuthentication();

就我而言,我不小心将它添加到生产环境范围内。有点像……

else if (env.IsProduction())
   
       ....
       app.UseAuthentication();
   

我的程序在开发环境中运行。所以app.UseAuthentication(); 没有到达。

【讨论】:

以上是关于如何解决始终返回使用 [Authorize(Roles = "Manager")] 的未经授权状态?的主要内容,如果未能解决你的问题,请参考以下文章

使用测试帐户在 Authorize.net 上测试退款?

为啥我应该始终为我的 Authorize 属性定义 JwtBearerDefaults.AuthenticationScheme?

`[Authorize (Roles="Role")]` 不起作用,User.IsInRole("Role") 始终为 false

如何解决调用 Amazon SP-API 的问题,该 API 始终返回未经授权,即使使用有效的令牌和签名也是如此

Authorize(Roles = "Admin") 总是返回 ACCESS DENIED

如何调试 [Authorize] 属性中的问题