有没有办法将 Authorize 属性与没有身份验证标头的请求一起使用?
Posted
技术标签:
【中文标题】有没有办法将 Authorize 属性与没有身份验证标头的请求一起使用?【英文标题】:Is there a way to use the Authorize attribute with a request that does not have an authentication header? 【发布时间】:2021-08-19 11:18:57 【问题描述】:我正在尝试将 API 从使用身份验证标头进行身份验证转换为使用 JSON 正文中的值进行身份验证。从现在开始,我将收到的请求将不包含身份验证标头。它们将在 JSON 请求正文的正文中包含不记名令牌。我能够使用OnMessageReceived
事件处理程序来解析令牌,但是在我点击OnMessageReceived
处理程序之前,我在输出中收到了授权失败消息。在通过身份验证处理程序之前,它似乎授权失败。至于AuthorizeAttribute,[Authorize]
和[Authorize(AuthenticationSchemes = "Bearer")]
都试过了,都没有成功。
我没有在我的 setup.cs 中放置任何自定义授权策略,所以它使用的是默认的。经过一番研究,我发现默认授权策略的唯一要求是DenyAnonymousAuthorizationRequirement
。我在下面包含了需求检查代码:
/// <summary>
/// Makes a decision if authorization is allowed based on a specific requirement.
/// </summary>
/// <param name="context">The authorization context.</param>
/// <param name="requirement">The requirement to evaluate.</param>
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
DenyAnonymousAuthorizationRequirement requirement)
var user = context.User;
var userIsAnonymous =
user?.Identity == null ||
!user.Identities.Any(i => i.IsAuthenticated);
if (!userIsAnonymous)
context.Succeed(requirement);
return Task.CompletedTask;
在我看来,如果没有 Authorization 标头,它会自动失败(这似乎是一个错误)。我尝试添加一个授权标头(带有有效和过期的令牌)并在OnMessageReceived
处理程序中放置一个断点。结果是HttpContext.User.Identity
(身份中的唯一身份),IsAuthenticated
值为 false。这与没有授权标头的请求的结果相匹配。
我的问题是是否可以在我的场景中使用 Authorize 属性。如果不是,是否需要创建授权过滤器?
【问题讨论】:
【参考方案1】:事实证明,我使用的是 .AddIdentityServerAuthentication()
,根据 IdentityServer (https://github.com/IdentityServer/IdentityServer4/issues/4892),它现在已过时。切换到.AddJwtBearer
解决了我的问题。授权按预期完美开箱即用。
【讨论】:
以上是关于有没有办法将 Authorize 属性与没有身份验证标头的请求一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core Authorize 属性与外部 JWT 身份验证微服务?
ASP .NET MVC 中的 Authorize 属性是不是用于身份验证和授权?
ASP.NET Core JWT 身份验证以保护 webAPI [Authorize] 属性错误 401 Unauthorized