使用 Microsoft Entra 和 Blazor InteractiveAuto 进行身份验证的 GraphQL 调用失败

问题描述 投票:0回答:1

我正在尝试将 Blazor 统一模型与 InteractiveAuto 结合使用。由于该页面可以在服务器端呈现,因此我也需要在服务器的 Program.cs 上设置 GraphQL 客户端。在我添加所需的授权之前,这一切正常。然后,它尝试使用 OIDC 再次进行身份验证,而不仅仅是使用 cookie。我尝试修改请求以包含 cookie,并强制 GraphQL 身份验证仅使用 Cookie 方案,但没有成功。奇怪的是端点返回的是 404 而不是预期的 400。

我验证了存在 .AspNetCore.Cookies 条目。此外,当我登录时,Nitro 能够在没有任何身份验证配置的情况下查询我的经过身份验证的端点,这似乎表明服务器不是问题,因为 Nitro 正在传递 cookie。如果我注销,Nitro 会收到相同的 404 而不是 400。

这是相关的 Auth 和 GraphQL 设置(在 Server-Side Program.cs 中)。

// Add GraphQL services
builder.Services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .AddMutationType<Mutation>()
    .AddAuthorization()
    .AddProjections()
    .AddFiltering()
    .AddSorting();

// Add GraphQL Client
builder.Services.AddScoped(sp =>
    new GraphQLHttpClient(config =>
    {
        config.EndPoint = new Uri($"{sp.GetRequiredService<NavigationManager>().BaseUri}graphql");
        config.HttpMessageHandler = new HttpClientHandler
        {
            CookieContainer = new CookieContainer(),
            UseCookies = true
        };
    }, new SystemTextJsonSerializer()));

// Add Azure AD authentication
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));

...

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
...
app.MapGraphQL().RequireAuthorization(new AuthorizeAttribute
{
    AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme
});
app.Run();
graphql blazor openid-connect
1个回答
0
投票

事实证明,我需要复制原始请求中的 cookie,因为 Blazor 服务器不会自动了解它们,因此仅创建一个空的 CookieContainer 的工作方式与 WASM 中的工作方式不同。

builder.Services.AddScoped(sp =>
    new GraphQLHttpClient(config =>
    {
        var baseUri = new Uri(sp.GetRequiredService<NavigationManager>().BaseUri);
        var cookie = sp.GetRequiredService<IHttpContextAccessor>().HttpContext?.Request.Cookies[".AspNetCore.Cookies"];
        var container = new CookieContainer();
        container.Add(new Cookie(".AspNetCore.Cookies", cookie, "/", baseUri.Host));
        config.EndPoint = new Uri($"{baseUri}graphql");
        config.HttpMessageHandler = new HttpClientHandler
        {
            CookieContainer = container,
            UseCookies = true
        };
    }, new SystemTextJsonSerializer()));
© www.soinside.com 2019 - 2024. All rights reserved.