ASP.NET Core中AuthorizationFilterContext的HttpContext.User返回空问题排查
问题原因及修复方案
1. 默认认证方案配置错误
你当前将默认认证方案设置为了Cookies,但API请求携带的是Bearer令牌,默认不会触发JwtBearer认证逻辑,自然不会填充HttpContext.User。
如果是前后端分离的纯API项目,直接将默认认证方案改为Bearer即可:
.AddAuthentication((options) => { // 若AddJwtBearer时指定了自定义方案名,请填写对应的自定义名 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; })
如果项目同时支持网页端Cookie认证和API的Bearer认证,可以在控制器/Action上通过[Authorize(AuthenticationSchemes = "Bearer")]指定当前接口使用的认证方案,也可以将该配置直接加到你自定义的RestrictedAttribute上。
2. OpenIdConnect配置冲突
你调用AddOpenIdConnect时,第一个参数传入的是和Cookie认证相同的方案名AuthorizationConstants.AuthenticationSchemes.Cookies,这会直接覆盖之前注册的Cookie认证配置,导致Cookie逻辑异常。需要改成独立的OIDC方案名:
.AddOpenIdConnect(AuthorizationConstants.AuthenticationSchemes.Oidc, (options) => { // 原有配置保持不变 })
3. 中间件缺失或顺序错误
请检查Program.cs(或Startup.cs)中是否添加了认证授权中间件,且顺序符合要求:
app.UseRouting(); // 必须先调用UseAuthentication,再调用UseAuthorization app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
如果缺失app.UseAuthentication(),所有认证逻辑都不会执行,User自然为空。
4. 自定义授权Filter不会主动触发认证
你自定义实现的IAuthorizationFilter本身不会触发认证流程,只有标注[Authorize]特性、或者在Filter内部主动调用认证逻辑,才会填充User对象,可选择两种方案修复:
- 直接将
RestrictedAttribute改为继承AuthorizeAttribute而不是实现IAuthorizationFilter,复用ASP.NET Core原生的认证授权逻辑 - 在
OnAuthorization方法开头主动触发Bearer认证:
public async void OnAuthorization(AuthorizationFilterContext context) { // 主动触发Bearer认证 var authResult = await context.HttpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); if (authResult.Succeeded) { context.HttpContext.User = authResult.Principal; } // 原有校验逻辑保持不变 }
补充:全局应用Bearer认证方案
如果你需要所有API接口默认走Bearer认证,可以在注册控制器时统一配置:
builder.Services.AddControllers(options => { var policy = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); });
内容的提问来源于stack exchange,提问作者Kiril1512
相关产品推荐
相关产品推荐

