web-dev-qa-db-ja.com

Authentication.AzureAD.UIライブラリを使用する場合のOpenIdConnectOptionsイベントの実装

サンプルから作成したライブラリを使用して、Azure Active Directoryで.NETコアWebアプリを認証し、さまざまなOpenIdConnectOptionsイベント(例:OnTokenValidated)を利用して特定のイベントを追加できるようにしています。 APIがトークンに基づいて呼び出し元のポリシーベースの決定を行えるように、プリンシパルに要求し、そのデータをIDのようなデータベースに追加します。

ただし、カスタマイズしたバリエーションではなく、Microsoft.AspNetCore.Authentication.AzureAD.UI NuGetパッケージを使用したいので、OpenIdConnectOptionsのイベントにアクセスしてアクセスする方法がわかりません。

それができることではないのか、それとも依存性注入のハンドルが足りないのか、その方法を理解するのに十分ではありません。

または、プロセスの別の部分でクレームなどを追加することを検討する必要がありますか?

public static AuthenticationBuilder AddAzureAD(
    this AuthenticationBuilder builder,
    string scheme,
    string openIdConnectScheme,
    string cookieScheme,
    string displayName,
    Action<AzureADOptions> configureOptions) {

    AddAdditionalMvcApplicationParts(builder.Services);
    builder.AddPolicyScheme(scheme, displayName, o => {
        o.ForwardDefault = cookieScheme;
        o.ForwardChallenge = openIdConnectScheme;
    });

    builder.Services.Configure(
        TryAddOpenIDCookieSchemeMappings(scheme, openIdConnectScheme, cookieScheme));

    builder.Services.TryAddSingleton<IConfigureOptions<AzureADOptions>, AzureADOptionsConfiguration>();

    // They put in their custom OpenIdConnect configuration, but I can't see how to get at the events.
    builder.Services.TryAddSingleton<IConfigureOptions<OpenIdConnectOptions>, OpenIdConnectOptionsConfiguration>();

    builder.Services.TryAddSingleton<IConfigureOptions<CookieAuthenticationOptions>, CookieOptionsConfiguration>();

    builder.Services.Configure(scheme, configureOptions);

    builder.AddOpenIdConnect(openIdConnectScheme, null, o => { });
    builder.AddCookie(cookieScheme, null, o => { });

    return builder;
}
9

ここでのパーティーには少し遅れるかもしれませんが、同じ問題に遭遇し、AzureAD認証ミドルウェアが非常にまばらに文書化されていることがわかりました。同じ質問に苦しんでいる他の人のためにここに解決策を追加します。

質問のコードスニペットの下部にあるように、AzureADプロバイダーは実際には内部でOpenIdConnectおよびCookie認証プロバイダーに依存しており、認証ロジック自体は実装していません。

これを実現するために、それぞれ_AzureADDefaults.OpenIdScheme_および_AzureADDefaults.CookieScheme_として定義された名前を使用して、2つの追加の認証スキームが追加されます。

(ただし、AddAzureAD(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, string scheme, string openIdConnectScheme, string cookieScheme, string displayName, Action<Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions> configureOptions)オーバーロードを使用する場合は名前をカスタマイズすることもできます)

これにより、OpenIdConnectOptionsへのアクセスを含め、上記のスキーム名を使用して、有効なCookieAuthenticationOptionsおよびOpenIdConnectEventsを構成できます。

この完全な例を参照してください。

_        services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

        services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
        {
            options.Events = new OpenIdConnectEvents
            {
                OnRedirectToIdentityProvider = async ctxt =>
                {
                    // Invoked before redirecting to the identity provider to authenticate. This can be used to set ProtocolMessage.State
                    // that will be persisted through the authentication process. The ProtocolMessage can also be used to add or customize
                    // parameters sent to the identity provider.
                    await Task.Yield();
                },
                OnMessageReceived = async ctxt =>
                {
                    // Invoked when a protocol message is first received.
                    await Task.Yield();
                },
                OnTicketReceived = async ctxt =>
                {
                    // Invoked after the remote ticket has been received.
                    // Can be used to modify the Principal before it is passed to the Cookie scheme for sign-in.
                    // This example removes all 'groups' claims from the Principal (assuming the AAD app has been configured
                    // with "groupMembershipClaims": "SecurityGroup"). Group memberships can be checked here and turned into
                    // roles, to be persisted in the cookie.
                    if (ctxt.Principal.Identity is ClaimsIdentity identity)
                    {
                        ctxt.Principal.FindAll(x => x.Type == "groups")
                            .ToList()
                            .ForEach(identity.RemoveClaim);
                    }                        
                    await Task.Yield();
                },
            };
        });

        services.Configure<CookieAuthenticationOptions>(AzureADDefaults.CookieScheme, options =>
        {
            options.Events = new CookieAuthenticationEvents
            {
                // ...
            };
        });
_
10
mthierba

クラスAzureADOptionsConfiguration>()で定義するConfigure関数にOnTokenValidatedイベントを追加できます。以下のように enter image description here

0