サンプルから作成したライブラリを使用して、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;
}
ここでのパーティーには少し遅れるかもしれませんが、同じ問題に遭遇し、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
{
// ...
};
});
_