Asp.Net Core 2 验证承载令牌

Posted

技术标签:

【中文标题】Asp.Net Core 2 验证承载令牌【英文标题】:Asp.Net Core 2 Validating bearer token 【发布时间】:2019-11-19 01:52:34 【问题描述】:

我正在努力寻找一种准确的方法来验证我的 OAuth bearer 令牌,该令牌是在将请求发送到正在处理的 API 时传递的,该 API 是一个 Asp.Net core 项目。

这里的目的是提取不记名令牌和Validate,如果一切正常,则继续请求。

到目前为止,我的发现有以下几点

JWT 熊令牌授权主要讲access_token

Asp.Net 核心安全中间件

处理此问题的自定义授权属性。

我不确定如何实现验证?我应该提取不记名令牌然后创建自定义验证方法吗?

理想情况下希望[Authorize] 属性来处理这个问题。

请给点建议?

【问题讨论】:

您确定要使用哪个流程了吗? @AustinTFrench 如前所述,理想情况下希望采用属性方式。但是,即使在 asp.net core 中创建自定义 auth 属性也有一定的限制? 属性键?你的智威汤逊有这么具体的拨款吗?我会考虑授权授权,并通过 API 获得额外的授权。 .NET 核心不受限制,尽管它发生了很大变化。 Core 2 使用了与 1.0 不同的库和方法(甚至在启动配置中),而 2.3 再次对其进行了更改。谁知道 Core 3 会做什么...... @AustinTFrench 你能解释一下关于授权授予的更多信息吗? 那里有很多(查看规范或从 oauth.net/2/grant-types/authorization-code 开始),我们将深入研究 cmets 中的杂草 【参考方案1】:

最后经过更多研究,我终于发现自定义 AuthorizationHandler 是一个更合适的解决方案,因为假设使用 Asp.Net Core 中未建议的自定义 Authorize 属性。

设置很简单,我可以从标头中提取我的Bearer 令牌,以便使用OAuth 进行进一步授权。

这是我的方法:

public class CustomAuthorizationHandler: IAuthorizationHandler

   public Task HandleAsync(AuthorizationHandlerContext context)
   
       var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
       string authHeader = authFilterCtx.HttpContext.Request.Headers["Authorization"];
       if (authHeader != null && authHeader.Contains("Bearer"))
       
          var token = authHeader.Replace("Bearer", "");
          // Now token can be used for further authorization
       

       throw new NotImplementedException();
    

最后在Startup.cs注册处理程序

public void ConfigureServices(IServiceCollection services)

    services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();

【讨论】:

根据docs.microsoft.com/en-us/aspnet/core/security/authorization/…,与其抛出异常不如“为了保证失败,即使其他需求处理程序成功,调用context.Fail。”【参考方案2】:

我认为将以下代码 sn-p 放入 ConfigureServices() 应该能够在安装 Microsoft.AspNetCore.Authentication.JwtBearer NuGet 包后验证您的 access_token:

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            
                //options.SaveToken = true;
                options.MetadataAddress = ValidationEndPoint;
                options.RequireHttpsMetadata = true;
                options.TokenValidationParameters = new TokenValidationParameters
                
                    ValidateIssuerSigningKey = true,
                    ValidateLifetime = true,
                    ValidateIssuer = true,
                    ValidateAudience = true,

                    ValidIssuer = tokenIssuer,
                    ValidAudiences = new[]  clientId ,
                    ValidAudience = null
                ;
            );

        services.AddAuthorization(options =>
        
            options.AddPolicy("MyPolicy", policy =>
            
                policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                policy.RequireAuthenticatedUser();
            );
        );

记得把 app.UseAuthentication()app.UseAuthorization() 放在 Configure() 方法中。并将 [authorize] 添加到您的控制器 API。

【讨论】:

以上是关于Asp.Net Core 2 验证承载令牌的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core 的自定义承载令牌授权

在 Asp.Net Core 中使用 Swagger 在请求中未发送授权承载令牌

即使在 asp.net core 5.0 中提供了不记名令牌,也会返回 401 [关闭]

使用 JWT 令牌的 ASP.NET Core 网站到 WebApi 身份验证

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权

ASP.NET Core 中的 Jwt 令牌身份验证