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

.NET Core中HotChocolate [Authorize]导致Schema无法加载问题求助

问题:添加HotChocolate授权属性后Schema无法加载,报错@AuthorizeDirective无法解析

我用.NET Core和Entity Framework构建了一个GraphQL API,未添加授权属性时所有查询正常执行,但给方法添加[HotChocolate.Authorization.Authorize(Policy = "Admin")]后,整个Schema无法连接,无法执行任何操作。

解析器代码

[HotChocolate.Authorization.Authorize(Policy = "Admin")]
public async Task<List<TestModel>> GetAll([Service] DataContext context)
{
    return await context.TestModel.ToListAsync();
}

Program.cs 代码

builder.Services.AddTransient<AuthService>().AddTransient<CRUDService>().AddGraphQLServer().AddQueryType<CRUDService>().AddMutationType<AuthService>();
builder.Services.AddAuthorization();

builder.Services.AddAuthorization(options =>
{
   options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin"));
});


var app = builder.Build();
app.UseAuthentication();
    
app.MapControllers();

app.UseCors("localhost");
app.MapGraphQL("/graphql");
app.UseMiddleware<AuthorizationMiddleware>();

app.Run();

报错信息

"Unable to infer or resolve a schema type from the type reference @AuthorizeDirective."

解决方案

你遗漏了HotChocolate授权指令的注册配置,HotChocolate不会自动识别[Authorize]属性对应的指令,需要显式添加到GraphQL服务配置中:

  1. 确保已安装HotChocolate.Authorization NuGet包(如果尚未安装)
  2. 修改GraphQL服务配置,添加.AddAuthorization()
    在AddGraphQLServer()的配置链中加入.AddAuthorization(),让HotChocolate注册授权相关的Schema指令。
  3. 调整中间件顺序(可选)
    移除自定义的AuthorizationMiddleware(如果不是必须的),改用HotChocolate结合ASP.NET Core原生授权中间件,确保UseAuthentication()之后调用UseAuthorization()。

修改后的Program.cs关键代码:

// 调整GraphQL服务配置,添加AddAuthorization()
builder.Services.AddTransient<AuthService>()
                .AddTransient<CRUDService>()
                .AddGraphQLServer()
                .AddAuthorization() // 新增:注册HotChocolate授权指令
                .AddQueryType<CRUDService>()
                .AddMutationType<AuthService>();

builder.Services.AddAuthorization(options =>
{
   options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin"));
});

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization(); // 新增:启用ASP.NET Core授权中间件

app.MapControllers();
app.UseCors("localhost");
app.MapGraphQL("/graphql");

// 移除自定义的AuthorizationMiddleware(如果不需要)
// app.UseMiddleware<AuthorizationMiddleware>();

app.Run();

原因说明

[HotChocolate.Authorization.Authorize]属性会生成GraphQL Schema中的@AuthorizeDirective指令,但如果没有通过.AddAuthorization()注册HotChocolate的授权扩展,Schema构建时无法识别这个指令类型,就会抛出无法解析的错误。添加该配置后,HotChocolate会自动处理授权指令的解析和验证逻辑,结合ASP.NET Core的授权策略完成权限校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:23:12