私はまだIdentityFrameworkを学んでおり、.Net Core 2MVCアプリケーションで認証をセットアップしようとしてかなり迷っています。私がしていることが正しいかどうかさえわからないので、どんな提案も歓迎されます。
認証にOpenIDConnect IDプロバイダーを統合し、承認にセカンダリデータソースを使用する必要があります。不便なことに、名前の主張を除いて、OIDCIdPからの主張を使用することはできません。残りのユーザークレームは、セカンダリデータソース(カスタムUserStore
およびUser
エンティティを介してIdentity Frameworkに接続されている)から取得する必要があります。
私が使用していますOpenIDの接続プロバイダの認証を処理します。これは正常に機能しており、最初のIDを取得します(1つのクレームしか使用できません)。ユーザーの2番目のIDを取得し、それをプリンシパルに追加して、デフォルトとして設定する必要があるときに、混乱が始まりますIdentity
。この2つ目Identity
は、役割を含むすべてのユーザークレームを提供します。
IDフレームワークについての私の理解はClaimsPrincipal
、Identity Frameworkの残りの部分にプラグインできるように、2つのIDを持つシングルが必要であるということです。ただし、2つのIDを使用ClaimsPrincipal
すると、デフォルトで最初のID(使用できないID)が自動的に選択されるため、カスタムClaimsPrincipal
を作成しPrimaryIdentitySelector
て、2番目のIDがプライマリになるように設定する必要があるようです。
public class MyClaimsPrincipal : ClaimsPrincipal
{
private static readonly Func<IEnumerable<ClaimsIdentity>, ClaimsIdentity> IdentitySelector = SelectPrimaryIdentity;
/// <summary>
/// This method iterates through the collection of ClaimsIdentities and chooses an identity as the primary.
/// </summary>
private static ClaimsIdentity SelectPrimaryIdentity(IEnumerable<ClaimsIdentity> identities)
{
// Find and return the second identity
}
}
OIDC IdPから検証済みのトークンを取得したら、2番目のIDをフェッチし、新しいMyClaimsPrincipalを作成し、2つのIDを新しいプリンシパルに追加します。その後、この新しいプリンシパルをどうするかわかりません。
を介してユーザーにサインインSignInManager
し、HTTPコンテキストでユーザーを明示的に設定し、ミドルウェアを使用ClaimsPrincipals
して変換しようとしましたMyClaimsPrincipals
が、これらはすべて何もしないようです。私は要点を見逃していると思います。
いくつかの具体的な質問:
OpenID Connectスキームを使用するときに知っておくべき重要なことは、スキームがそれ自体では機能しないということです。あなたが見つけることができるほとんどすべての例で、あなたはそれがクッキースキームと組み合わされているのを見るでしょう。この理由は非常に単純です。OIDCは、外部認証プロバイダーでユーザーを認証するためのものです。ただし、その認証は一時的なものにすぎません。アプリケーション内でローカルに保存するには、ユーザーにサインインする必要があります。これは通常、Cookie認証スキームを使用して実行されます(他の方法で実行することもできます)。
OIDCとCookieを使用するアプリケーションの認証フローは、通常、次のように機能します。
したがって、すべてが適切に機能したと仮定すると、OIDCスキームは認証に再び関与することはありません。代わりに、CookieのIDが毎回使用されます。
これを目的に使用して、OIDCスキームがサインインし、Cookieスキームによって永続化される前に、追加のクレームで作成されたプリンシパルを拡張できます。これは、OIDCスキームとCookieスキームの間にあるカスタムサインインスキームを使用して行うことも、チャレンジの完了後、サインインが発生する前に呼び出されるOIDCスキームの認証イベントにアタッチすることもできます。
この目的でTicketReceived
イベントを使用できます。
public void ConfigureServices(IServiceCollection services)
{
// …
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
// …
options.Events.OnTicketReceived = OnOpenIdConnectTicketReceived;
});
}
public static Task OnOpenIdConnectTicketReceived(TicketReceivedContext context)
{
if (context.Principal.Identity is ClaimsIdentity identity)
{
identity.AddClaim(new Claim("foo", "bar"));
}
return Task.CompletedTask;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加