为什么 GraphQL .Net HttpConext 没有正确的用户 session?

Why does GraphQL .Net HttpConext not have the correct user session?

我正在使用 GraphQL .net to respond to graphql queries on the backend of an Asp.net Core website. All the cookies seem to be passed with the requests but for some reason my graphql.net requests do not have the proper user session set on the HttpContext. The ClaimPrincipal 通过 graphql.net 大部分是空的,而我的 Asp.net 核心 WebApi/Mvc 样式端点具有正确的主体和用户 ID,即使两者 GraphQl.Net 请求和 non-graphql.net 请求同时发生。

我检查了负载,两个请求都传递了所有相同的 cookie。所以这让我想知道为什么我的常规 WebApi 端点能够 (auto-magically) 获取声明主体,为什么 graph.net 端点不能做同样的事情。据我以前使用 GraphQl.net 所知,我不知道必须添加任何特殊的 session 代码(除了将用户从 HttpContext 传递到 graphQL.net)。 我一直在通读 GraphQL.Net 和 Asp.net 核心源代码和文档,但到目前为止我还没有发现任何明显的违规行为或线索。

什么可能会导致这样的问题?有哪些常见原因? 我是否应该尝试弄清楚如何手动将 cookie 读入 Asp.net 核心并拉取主体?

也许我遗漏了一个特殊的 header 值?我不认为 header 很奇怪,但我没有对 graphql.net 和 asp.net 核心请求中的 header 进行并排比较。

在这段代码中,我首先发现了一个问题。如果我在此处放置断点,则未为当前用户正确设置 claimsprinical session。稍后当我访问 HttpContext 时,用户 session 对于 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);

如果有人需要,我很乐意提供任何请求的配置,但它涉及很多可能的代码。谢谢!

您的 Configure 方法是什么样的?你的 app.UseAuthentication() before 是你的 GraphQL 中间件配置吗?

public void Configure(IApplicationBuilder app)
{
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseGraphQL<MySchema>();
}

https://github.com/dotnet/aspnetcore/blob/790c4dc2cf59e16e6144f7790328d563ca310533/src/Security/samples/Cookies/Startup.cs#L45-L66