2

HotChocolate でGraphQLを追加した新しい ASP.Net Core 3 MVC サイトがあります。Auth0 で Cookie ベースの認証を使用して MVC 側にサインインするユーザーがいます。

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
    .AddCookie()
    .AddOpenIdConnect("Auth0", options =>
        {
            ...
        });

しかし、GraphQL リクエストの場合は、JWT 認証が必要です。これには次を使用します。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(config =>
        {
            ...
        });

どちらも独立して正常に動作します。Cookie 認証により、コントローラーの使用が許可されます。JWT 認証は GQL の使用を許可します。/graphqlしかし、コントローラーのCookie認証とルートのJWTを取得する方法がわかりません。

ちょっとしたコンテキスト: HotChocolate はカスタム ミドルウェアを使用して、/graphqlルートに着信するリクエストを処理します。Authorizeコントローラー上にないため、配置するコントローラーがないため、属性でスキームを指定することはできません。

類似の質問

(他にもいくつかあり、主に REST と MVC の組み合わせに焦点を当てていましたが、これらは両方ともコントローラーに送られるため、シナリオは少し異なります。)

4

4 に答える 4

2

私は非常によく似た問題を抱えていたので、解決策を共有したいと思いました。私の場合、両方の認証スキーマを HotChocolate API に適用したいと考えました。この属性を追加することで、通常のコントローラー エンドポイントに対してこれを行うことができました。

[Authorize(AuthenticationSchemes = "Bearer" + "," + "OpenIdConnect")]

両方のスキーマを HotChocolate graphql エンドポイントに適用するために、スタートアップでこのトリックを実行しました

       endpoints.MapGraphQL().RequireAuthorization()
            .Add((endpointBuilder) =>
            {
                var authAttribute = endpointBuilder.Metadata.SingleOrDefault(x =>
                    x is Microsoft.AspNetCore.Authorization.AuthorizeAttribute);
                if (authAttribute != null)
                    ((Microsoft.AspNetCore.Authorization.AuthorizeAttribute) authAttribute)
                        .AuthenticationSchemes = "Bearer" + "," +
                                                 "OpenIdConnect";
            });
于 2021-09-13T20:14:23.217 に答える