我使用Microsoft记录的多重JWT承载身份验证这一切都很好,直到我将其放入一个应用程序中,该应用程序具有需要可选身份验证的控制器方法(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.JwtBear.JwtBearerHandler:失败以验证令牌。Microsoft.IdentityModel.Tokens.SecurityTokenUnableToValidateException:IDX10516:签名验证失败。无法匹配密钥:
现在,据我所知,当第一个jwt方案无法验证令牌时,这是正常的。。第二个罐子。但是,在我的OptionalAuthorizationAttribute
中,context.HttpContext.User.Identity
现在未经身份验证,因此请求仍然被拒绝。我猜User.Identity
是由通过默认方案后从令牌中获得的内容填充的(该方案无法验证令牌,因此它是一个空的ClaimsIdentity
且未经授权。
我有没有可能从第二个身份验证方案中获得身份?(并使其通用,以防我需要添加额外的身份验证方案(。
如果我把控制器上的[OptionalAuthorization]
标签换掉,换成[Authorize]
,这样我就知道我的设置已经完成了。。只是在使用第二种方案验证令牌之前触发了我的属性。
这是一个控制器,显示了我如何使用OptionalAuthorizationAttribute
[Route("[controller]")]
[ApiController]
public class WebDirectoryController:ControllerBase
{
[HttpGet]
[OptionalAuthorization]
[Route("Sources")]
public IActionResult GetPlugins()
{
... implementation
}
}
我一直在深入研究这个主题,看完之后,我想从如何处理多个JWT令牌的身份验证的角度做出回应。
我假设您共享的代码是一个定义自定义身份验证策略的类。通过我的研究,我看到了使用AuthorizationPolicyBuilder
的官方文档:使用多种身份验证方案
我不明白为什么你不能在上面链接的微软文档之后,在启动时使用配置值来确定是否要添加可选的身份验证策略。