【问题标题】:Disable Bearer Token validation for a controller method禁用控制器方法的承载令牌验证
【发布时间】:2019-10-15 10:02:01
【问题描述】:

我正在尝试跳过我想在我的 API 上“公开”的方法的令牌验证。

在我的 StartUp 中,我收到以下事件来检查呼叫是否被授权:

 x.Events = new JwtBearerEvents
 {
     OnTokenValidated = async context =>
     {
         var sessionManager = context.HttpContext.GetService<ISessionManager>();

         if (!sessionManager.IsCurrentTokenValid())
         {
             context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
             var message = Encoding.UTF8.GetBytes("invalidToken");
             context.Response.OnStarting(async () =>
             {
                 await context.Response.Body.WriteAsync(message, 0, message.Length);
             });
         }
     }
 };

我试图从控制器中删除[Authorize] 属性,但上面的代码仍然触发 还尝试在我想跳过验证但仍然触发上述代码的方法上添加[IgnoreAntiforgeryToken(Order = 1001)]

你知道我怎样才能只对某些方法禁用它吗?

【问题讨论】:

    标签: c# asp.net-core jwt-auth


    【解决方案1】:

    通常您使用[AllowAnonymous] 装饰您希望允许不进行身份验证的控制器或操作(请参阅docs)。

    如果您有多个身份验证(Jwt、Cookie)并且您希望特定端点仅允许使用特定身份验证,则使用方案属性,即[Authorize(Scheme = "Cookie)]

    【讨论】:

    • 因为您仍在发送我假设的令牌。不要在不需要身份验证的操作上发送令牌(来自客户端)
    • 很遗憾,我无法控制客户端。无论如何,他们可能会发送它。不管客户端发送令牌,有没有办法禁用它?
    • 您上面得到的代码是关于令牌验证(到期日期、受众、颁发者、签名),而不是身份验证。所以它检查的地方是错误的。当客户端发送令牌时,其余服务必须假定用户想要访问受保护的操作。当没有发送令牌时,不应该执行任何 jwt 验证,它会退回到身份验证中间件。
    • 无论如何,甚至不知道为什么要检查OnTokenValidated,在验证 Jwt 令牌并创建声明主体后调用此回调(意味着:用户已登录/验证此时成功)。当它被调用时,您已经知道令牌是有效的。您在那里进行检查的目标是什么?令牌撤销?
    • 您不必这样做,JWT 是自包含的。它受其签名的保护。 JWT 的全部意义在于您不需要往返于数据库,只需验证其内容和签名就足以知道其有效。您所做的与 JWT 的用途相反
    【解决方案2】:

    如果端点实现AllowAnonymous,请尝试忽略令牌验证结果

    x.Events = new JwtBearerEvents
    {
        OnTokenValidated = async context =>
        {
            var sessionManager = context.HttpContext.GetService<ISessionManager>();
            var endpoint = context.HttpContext.Features.Get<IEndpointFeature>()?.Endpoint;
            var allowAnon = endpoint?.Metadata.GetMetadata<IAllowAnonymous>() != null;
    
            if (!allowAnon && !sessionManager.IsCurrentTokenValid())
            {
                context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                var message = Encoding.UTF8.GetBytes("invalidToken");
                context.Response.OnStarting(async () =>
                {
                    await context.Response.Body.WriteAsync(message, 0, message.Length);
                });
            }
        }
    };
    

    【讨论】:

    • @MassimilianoPeluso 如果它为 null 表示它不存在 404,您能否验证您访问的端点是否正确?我也会尝试验证没有重定向发生。
    • 功能列表中没有 IEndpoint fetuare。端点是正确的,它返回 http 200
    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2017-09-13
    • 2022-01-23
    • 2017-02-24
    • 1970-01-01
    相关资源
    最近更新 更多