繁体   English   中英

ASP.NET 5.0 中可选授权有多种 JWT 认证方案

[英]Optional authorization with multiple JWT authentication schemes in ASP.NET 5.0

我正在使用Microsoft记录的多个 JWT Bearer 身份验证一切正常,直到我将其放入具有需要可选身份验证的 controller 方法的应用程序(appsettings.json 中的一个属性控制请求是否需要认证与否)

我正在使用我自己的实现IAsyncAuthorizationFilter的属性进行可选的身份验证

public class OptionalAuthorizationAttribute: Attribute, IAsyncAuthorizationFilter
{

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        SetUnauthorized(context);
    }

    public Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        SetUnauthorized(context);
        return Task.CompletedTask;
    }

    private void SetUnauthorized(AuthorizationFilterContext context)
    {
        var configService = (IConfiguration)context.HttpContext.RequestServices.GetService(typeof(IConfiguration));
        if (configService != null)
        {
            var enableAuth = configService.GetValue<bool>("AppSettings:EnableAuthentication");
            if (enableAuth)
            {
                if (user?.Identity?.IsAuthenticated != true)
                {
                    context.Result = new UnauthorizedResult();
                }
            }
        }
        else
        {
            context.Result = new UnauthorizedResult();
        }
    }

}

当我使用单一身份验证方案时,这就像一个魅力。 当我使用两个方案时,它适用于默认方案('Bearer',但不是我的第二个方案)。 查看日志,我看到了这个

2021-07-19 14:50:41.616 +02:00 [信息] Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:无法验证令牌。 Microsoft.IdentityModel.Tokens.SecurityTokenUnableToValidateException:IDX10516:签名验证失败。 无法匹配密钥:

现在,据我所知,当第一个 jwt 方案无法验证令牌时这是正常的......第二个可以。 但是,在我的OptionalAuthorizationAttribute context.HttpContext.User.Identity中现在未经身份验证,因此请求仍然被拒绝。 我猜测User.Identity正在通过默认方案(无法验证令牌,因此它是一个空的ClaimsIdentity且未经授权)后从令牌中获取的内容填充。

我有机会从第二个身份验证方案中获取身份吗? (并使其通用,以防我需要添加额外的身份验证方案)。

如果我换掉 controller 上的[OptionalAuthorization]标签并将其替换为[Authorize] ,一切正常方案。

这是一个 controller 显示我如何使用我的OptionalAuthorizationAttribute

[Route("[controller]")]
[ApiController]
public class WebDirectoryController:ControllerBase 
{

    [HttpGet]
    [OptionalAuthorization]
    [Route("Sources")]
    public IActionResult GetPlugins()
    {
        ... implementation
    }

}

我一直在深入研究这个主题,在阅读完这篇文章后,我想以我对如何使用多个 JWT 令牌进行身份验证的观点做出回应。

我假设您共享的代码是定义自定义身份验证策略的 class。 通过我的研究,我看到了使用AuthorizationPolicyBuilder的官方文档: Use multiple authentication schemes

我不明白为什么您不能按照上面链接的 Microsoft 文档确定是否要在启动时使用配置值添加可选的身份验证策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM