0

我正在使用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);

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

4

1 回答 1

1

你的Configure方法是什么样的?你app.UseAuthentication() 之前是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

于 2020-11-30T21:56:23.987 回答