You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET6 Web API中AuthorizationHandler执行Succeed仍返回403问题

问题根因
  • 核心错误在自定义授权处理器的实现:你写的return Task.FromResult(() => context.Succeed(requirement)) 仅将一个调用Succeed方法的Lambda表达式作为结果装入返回的Task,这个Lambda永远不会被框架执行,也就是说即使命中了管理员身份判断分支,你也从未真正调用context.Succeed()标记授权通过,授权上下文始终处于未通过状态,最终返回403。
  • 次要问题是中间件注册顺序错误:你将app.UseHttpsRedirection()放在了认证、授权中间件之后,不符合ASP.NET Core中间件管道的执行顺序要求,部分场景下会导致用户身份信息无法正确加载到授权上下文。
修复步骤
  1. 修正自定义授权处理器的逻辑,直接在判断分支中调用授权状态标记方法,最后返回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;
    }
}
  1. 调整中间件注册顺序,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:12:23