.NET6 Web API中AuthorizationHandler执行Succeed仍返回403问题
问题根因
- 核心错误在自定义授权处理器的实现:你写的
return Task.FromResult(() => context.Succeed(requirement))仅将一个调用Succeed方法的Lambda表达式作为结果装入返回的Task,这个Lambda永远不会被框架执行,也就是说即使命中了管理员身份判断分支,你也从未真正调用context.Succeed()标记授权通过,授权上下文始终处于未通过状态,最终返回403。 - 次要问题是中间件注册顺序错误:你将
app.UseHttpsRedirection()放在了认证、授权中间件之后,不符合ASP.NET Core中间件管道的执行顺序要求,部分场景下会导致用户身份信息无法正确加载到授权上下文。
修复步骤
- 修正自定义授权处理器的逻辑,直接在判断分支中调用授权状态标记方法,最后返回
Task.CompletedTask即可,修正后的代码如下:
public class IsApplicationAdministratorHandler : AuthorizationHandler<IsAdministratorRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsAdministratorRequirement requirement) { if (context.User.HasClaim(c => c.Type.Equals("applicationAdmin")) || context.User.HasClaim(c => c.Type.Equals("platformAdmin"))) { // 直接标记授权通过,不要将该调用包裹在未执行的Lambda中 context.Succeed(requirement); } else { context.Fail(); } // 返回已完成任务即可 return Task.CompletedTask; } }
- 调整中间件注册顺序,将HTTPS重定向中间件移动到认证、授权中间件之前,修正后的管道配置片段如下:
var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 按正确顺序注册中间件:HTTPS重定向 -> 认证 -> 授权 app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
效果说明
修正后,当请求携带的Token包含applicationAdmin或platformAdmin声明时,授权处理器会直接将上下文标记为授权通过,请求可正常访问受isAdministrator策略保护的接口,不会再返回403状态码。
内容的提问来源于stack exchange,提问作者JDBennett
相关产品推荐
相关产品推荐

