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

HotChocolate解析器ClaimsPrincipal无法加载JWT声明问题

问题根因

共3处核心配置错误,按影响程度排序:

  • 中间件与端点映射顺序错误:你单独用app.UseEndpoints()块映射GraphQL端点,这段代码放在其他所有端点映射之后,在WebApplication的执行模型下,拆分的端点注册会导致GraphQL请求没有经过UseAuthentication、UseAuthorization中间件处理,JwtBearer认证逻辑根本没有执行,自然不会把JWT解析出的声明填充到HttpContext.User,HotChocolate传递给解析器的ClaimsPrincipal自然是空的。
  • 自定义请求拦截器创建了未认证的匿名身份:你在HttpRequestInterceptor里新建ClaimsIdentity时没有传入认证类型参数,按照.NET身份体系规则,未指定认证类型的ClaimsIdentity的IsAuthenticated属性固定返回false,会干扰正常的身份认证判断。
  • GraphQL端点未开启强制认证:你把MapGraphQL().RequireAuthorization()注释掉了,默认情况下匿名请求不会触发JwtBearer组件的令牌解析流程。

另外还有一处后续会触发异常的配置遗漏:你只在DI容器中注册了MinimumAgeHandler,SalesDepartmentAuthorizationHandler没有注册,认证修复后访问打了SalesDepartment策略的接口会抛出找不到授权处理器的错误。

修复步骤
  1. 修正端点注册顺序,删除独立的app.UseEndpoints块,将GraphQL端点和其他端点统一放在认证授权中间件之后注册,同时开启端点授权要求:
    // 保留app.UseAuthentication()、app.UseAuthorization()的位置不变
    // 直接在app.UseAuthorization()之后注册所有端点,删掉原来的app.UseEndpoints代码块
    app.MapRazorPages();
    app.MapControllers();
    app.MapGraphQL().RequireAuthorization(); // 取消注释RequireAuthorization
    app.MapFallbackToFile("index.html");
    
  2. 修复自定义请求拦截器的身份创建逻辑,给新建的ClaimsIdentity传入和JwtBearer一致的认证类型,避免生成匿名身份:
    public class HttpRequestInterceptor : DefaultHttpRequestInterceptor
    {
        public override ValueTask OnCreateAsync(HttpContext context,
            IRequestExecutor requestExecutor, IQueryRequestBuilder requestBuilder,
            CancellationToken cancellationToken)
        {
            // 传入JwtBearer默认认证方案作为认证类型
            var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
            identity.AddClaim(new Claim(ClaimTypes.Country, "us"));
            context.User.AddIdentity(identity);
            return base.OnCreateAsync(context, requestExecutor, requestBuilder, cancellationToken);
        }
    }
    
  3. 补全授权处理器的DI注册:
    // 在AddAuthorization附近补上这行
    builder.Services.AddSingleton<Microsoft.AspNetCore.Authorization.IAuthorizationHandler, SalesDepartmentAuthorizationHandler>();
    
  4. (可选)清理冗余的手动JWT解析代码:以上配置修复完成后,HotChocolate注入的ClaimsPrincipal会和HttpContext.User完全一致,携带JWT中所有合法声明,你自定义的JwtParser手动解析逻辑可以删除,不需要重复解析请求头中的令牌。
验证

修复完成后,解析器中直接通过注入的claimsPrincipal.FindFirstValue(ClaimTypes.NameIdentifier)即可拿到正确的用户标识,配置的[Authorize]策略也会正常触发校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:33:35