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

ASP.NET Core中AuthorizationHandlerContext.User始终为null的问题

解决ASP.NET Core中PermissionAuthorizationHandler里context.User为null的问题

可能原因及对应解决方案

1. 认证与授权中间件顺序错误

ASP.NET Core中认证中间件必须在授权中间件之前注册,否则授权流程无法获取已认证的用户信息。

检查Program.cs(或Startup.cs)中的配置顺序,确保:

// 先配置认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => {
        options.TokenValidationParameters = new TokenValidationParameters {
            ValidateIssuer = true,
            ValidIssuer = builder.Configuration["Jwt:ValidIssuer"],
            // 补充你的JWT其他验证配置
        };
    });

// 再配置授权服务及自定义策略
builder.Services.AddAuthorization(options => {
    options.AddPolicy("PermissionCheck", policy =>
        policy.Requirements.Add(new PermissionRequirement("TargetPermission")));
});

// 注册自定义授权Handler到DI容器
builder.Services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();

// 中间件注册顺序必须遵循:认证在前,授权在后
app.UseAuthentication();
app.UseAuthorization();

2. 目标端点未启用认证

如果API控制器/方法未添加[Authorize]属性,或未配置全局授权策略,授权流程会跳过认证步骤,导致context.User为null。

  • 给需要授权的控制器/方法添加属性:
[Authorize(Policy = "PermissionCheck")]
[ApiController]
[Route("api/[controller]")]
public class DemoController : ControllerBase
{
    // 接口逻辑
}
  • 或配置全局默认授权,强制所有端点需要认证:
builder.Services.AddAuthorization(options => {
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

3. 请求未携带有效认证凭证

如果请求未正确携带JWT Token(或其他认证凭证),认证流程无法识别用户,context.User自然为null。

  • 检查请求头是否包含Authorization: Bearer {你的有效Token};
  • 验证Token是否符合配置要求(未过期、签名正确、Issuer/Audience匹配)。

4. 自定义Handler注册错误

确保PermissionAuthorizationHandler已正确注册到依赖注入容器,否则授权流程无法调用该Handler,也会导致用户信息无法正常传递。

确认Program.cs中存在以下注册代码:

builder.Services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();

额外代码优化建议

在HandleRequirementAsync方法中,建议补充用户认证状态检查,比单纯判断context.User != null更严谨:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
    // 先验证用户是否已通过认证
    if (!context.User.Identity?.IsAuthenticated ?? true)
    {
        return;
    }

    // 后续角色权限检查逻辑...
}

内容的提问来源于stack exchange,提问作者George Otoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:55:18