.NET Core中HotChocolate [Authorize]导致Schema无法加载问题求助
我用.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服务配置中:
- 确保已安装
HotChocolate.AuthorizationNuGet包(如果尚未安装) - 修改GraphQL服务配置,添加
.AddAuthorization()
在AddGraphQLServer()的配置链中加入.AddAuthorization(),让HotChocolate注册授权相关的Schema指令。 - 调整中间件顺序(可选)
移除自定义的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
相关产品推荐
相关产品推荐

