【问题标题】:How to make jwt bearer token not required in .NET Core 6?如何在 .NET Core 6 中制作不需要的 jwt 不记名令牌?
【发布时间】:2022-02-16 21:51:03
【问题描述】:

我有一个 JWT Bearer 身份验证的配置,但有时我不想使用 JWT 令牌,而是想在请求标头中使用 API KEY 并在中间件中检查此密钥。

但在这种情况下,当我不将不记名令牌放在标头中时,我总是以未经授权的响应代码进行响应。

如何禁用不记名令牌检查?

我的配置:

    services.AddAuthentication(x =>
    {
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options =>
    {
        // options.RequireHttpsMetadata = false;
        // options.SaveToken = true;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            ValidateIssuer = true,
            ValidateAudience = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtSettings.Secret)),
            ValidIssuer = jwtSettings.Issuer,
            ValidAudiences = jwtSettings.Audiences,
            ClockSkew = TimeSpan.Zero // remove delay of token when expire
        };
     });

【问题讨论】:

  • Hmm.. 在我看来,定义它的“正确”方法是在 JWT Bearer 之外定义一个新的身份验证方案。然后,您将在您的 JWT Bearer 方案上添加一个转发默认选择器,如果 API 密钥标头等存在,则将请求的方案更改为您的 API 密钥身份验证方案。

标签: asp.net asp.net-core authentication jwt


【解决方案1】:

您可以通过使用 multipe AuthenticationSchemes 来实现此目的,而不是使用更惯用的方式检查中间件。有关更多详细信息,请参阅 MSDN 链接,但在非常高的级别上,您可以分配添加多个身份验证方案,每个都有不同的方案。然后在使用 autorize 属性时引用此方案名称(例如 [Authorize(AuthenticationSchemes = "Api-Key-Scheme")])。

services
  .AddAuthentication()
  .AddJwtBearer(options => { .. })
  .AddApiKey(options => { .. });  // custom code

上面的.AddApiKey() 方法需要自定义AuthenticationHandler<T> 实现,可以在此处找到如何执行此操作的示例 - https://josef.codes/asp-net-core-protect-your-api-with-api-keys/

【讨论】:

    【解决方案2】:

    您可以在您的方法中使用[AllowAnonymous] 属性来禁用身份验证检查。

    然后,创建一个ActionFilterAttribute 并将其应用于相同的方法:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    
    namespace YourNameSpace
    {
        public class RequireYourKeyHeader : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if(!filterContext.HttpContext.Request.Headers.TryGetValue("YourKey", out string headerValue))
                {
                    filterContext.Result = new BadRequestObjectResult("missing headr value");
                }
                
                // TODO: check if value passed in the header is actually valid
            }
        }
    }
    

    通过[RequireYourKeyHeader]申请

    【讨论】:

    • 但我想将此 API 密钥检查应用于我的所有方法,然后我不想添加此属性:(
    • @KiênĐinh 在控制器上应用该属性。或者使用具有该属性的基类,并让每个控制器(您希望所有方法执行代码的地方)都从基类继承
    猜你喜欢
    • 2022-11-26
    • 2020-01-20
    • 2020-05-14
    • 2016-09-25
    • 2016-11-20
    • 2015-08-13
    • 2019-03-23
    • 2021-07-12
    • 2020-11-20
    相关资源
    最近更新 更多