[英]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.