我正在使用GraphQL .net来响应 Asp.net Core 网站后端的 graphql 查询。所有 cookie 似乎都随请求一起传递,但由于某种原因,我的 graphql.net 请求没有在 HttpContext 上设置正确的用户会话。ClaimPrincipal通过graphql.net 大部分是空的,而我的 Asp.net Core WebApi/Mvc 样式端点具有正确的主体和用户 ID,即使 GraphQl.Net 请求和非 graphql.net 请求同时发生。
我检查了有效负载,并且在两个请求中都传递了所有相同的 cookie。所以这让我想知道为什么我的常规 WebApi 端点能够(自动)获得声明主体,为什么 graph.net 端点不能这样做。据我从 GraphQl.net 以前的用法中知道,我不知道必须添加任何特殊的会话代码(除了将用户从 HttpContext 传递到 graphQL.net)。我一直在阅读 GraphQL.Net 和 Asp.net 核心源代码和文档,但到目前为止我还没有发现任何明显的违规或线索。
什么可能导致这样的问题?有哪些常见原因? 我是否应该尝试弄清楚如何手动将 cookie 读取到 Asp.net 核心并提取主体?
也许我错过了一个特殊的标题值?我不认为标头很奇怪,但我还没有对 graphql.net 和 asp.net 核心请求中的标头进行并排比较。
在这个片段中,我首先发现了一个问题。如果我在此处放置断点,则没有为当前用户会话正确设置声明原则。后来当我访问 HttpContext 时,用户会话对于 graphql.net 请求不正确。
public static GraphQLUserContext InitializeFromContext(HttpContext httpContext)
{
return new GraphQLUserContext
{
User = httpContext.User,
};
}
这是 Graphql.net 配置的一部分:
services.AddGraphQL((options, provider) =>
{
options.EnableMetrics = _env.IsDevelopment();
var logger = provider.GetRequiredService<ILogger<WebDependencyInjectionConfig>>();
options.UnhandledExceptionDelegate = ctx => logger.LogError("{Error} occurred", ctx.OriginalException.Message);
})
.AddErrorInfoProvider(opt =>
{
opt.ExposeExceptionStackTrace = _env.IsDevelopment();
opt.ExposeCodes = _env.IsDevelopment();
opt.ExposeCode = _env.IsDevelopment();
opt.ExposeData = _env.IsDevelopment();
opt.ExposeExtensions = _env.IsDevelopment();
})
.AddSystemTextJson()
.AddUserContextBuilder(GraphQLUserContext.InitializeFromContext)
.AddGraphTypes(typeof(PrimarySchema), ServiceLifetime.Scoped);
如果有人需要,我很乐意提供任何请求的配置,但它涉及到很多可能的代码。谢谢!