.Net Core 2 OpenIDConnect認証と複数のID

ヨーク

私はまだ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が、これらはすべて何もしないようです。私は要点を見逃していると思います。

いくつかの具体的な質問:

  • これはこれを行うための最良の方法ですか?これらすべてについて一般的に混乱していると、私が正しい方向に進んでいるかどうかを判断するのが難しくなります。
  • カスタムプリンシパルを作成したら、それをHTTPコンテキストに「設定」して、永続的にする方法を教えてください。
  • Cookie認証はOpenIdConnect認証とどのように連携しますか?OIDCはどういうわけかユーザーをCookie認証に渡すようであり、OIDC認証が機能するにはCookie認証を追加する必要があるようです。
ポーク

OpenID Connectスキームを使用するときに知っておくべき重要なことは、スキームがそれ自体では機能しないということです。あなたが見つけることができるほとんどすべての例で、あなたはそれがクッキースキームと組み合わされているのを見るでしょう。この理由は非常に単純です。OIDCは、外部認証プロバイダーでユーザーを認証するためのものです。ただし、その認証は一時的なものにすぎません。アプリケーション内でローカルに保存するに、ユーザーサインインする必要があります。これは通常、Cookie認証スキームを使用して実行されます(他の方法で実行することもできます)。

OIDCとCookieを使用するアプリケーションの認証フローは、通常、次のように機能します。

  1. ユーザーがアプリケーションにアクセスします。
  2. 認証:デフォルトの認証スキームであるCookieスキームは、ユーザーの認証を試みます。Cookieがない場合、ハンドラーは認証にチャレンジします。
  3. チャレンジ:デフォルトのチャレンジスキームであるOIDCスキームは、ユーザーにチャレンジし、外部認証プロバイダーにリダイレクトします。
  4. ユーザーは外部認証プロバイダーで認証され、アプリケーションにリダイレクトされます。
  5. チャレンジコールバック:OIDCスキームは、外部認証プロバイダーからの応答を受け取り、チャレンジを完了して、クレームプリンシパルを作成します。
  6. サインイン:OIDCスキームは、構成されたサインインスキーム(Cookieスキーム)を使用してそのプリンシパルにサインインします。
  7. Cookieスキームはユーザーにサインインし、ユーザーのブラウザに保持されるCookieを作成します。
  8. その後のアプリケーションへのリクエストで、ユーザーは有効なCookieを含めるため、Cookieスキームは、OIDCスキームに再度チャレンジすることなく、ユーザーを正常に認証できます。

したがって、すべてが適切に機能したと仮定すると、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]

編集
0

コメントを追加

0

関連記事

分類Dev

ASP.NET Core Web API + Angular2の承認と認証

分類Dev

ASP.NET Core2のさまざまな領域の認証とLoginPath

分類Dev

ASP.NET Core2のトークンまたはOpenIDConnectのいずれかを使用して認証します

分類Dev

.Net Core 2.xMVCアプリでのWindowsAD認証の構成

分類Dev

ASP.NET Core2アプリケーションでidentityserver4のOpenIdConnect認証をサインアウトできません

分類Dev

ASP.NET Core2 +のILoggerとDependencyInjection

分類Dev

.NET Core2のStructureMapとProto.Actor

分類Dev

.NET Core 2 Password Hashing

分類Dev

ASP.Net Core2複数のコントローラー

分類Dev

Asp.Net Core2でのトークンベースの認証

分類Dev

ASP.NET Core 2:UserManagerとDbContext

分類Dev

.NET CoreとASP.NET Core

分類Dev

.NET Core2でのADFS3.0フェデレーション認証

分類Dev

ASP.Net Core 2のCookie(DBなし)を使用したGoogle認証

分類Dev

.NET Core上のX509Certificate2.CreateFromCertFile()

分類Dev

.NET Core2で同等のReadAsMultipartAsync

分類Dev

ASP.NET Core2のweb.config

分類Dev

.NET Core2のSystem.Web.ApplicationServices

分類Dev

Web APIのAuthorizeAttribute(ASP.NET Core 2)

分類Dev

Angular 2 & .NET Core Web API HttpPost の問題

分類Dev

.Net Core 2FromSqlの問題

分類Dev

Identity Server 4 .Net Core 2.0:複数認証タイプ

分類Dev

.NET Standardと.NET Core

分類Dev

.Net CoreとNuGet

分類Dev

.NET CoreのSOAP?

分類Dev

ASP .NET CORE 2.2 JWT&WebサイトのID認証を要求

分類Dev

Swashbuckle .NET Core2でのJWTベアラーの承認

分類Dev

ASP.NET Coreの基本認証

分類Dev

ASP.NET Coreの基本認証

Related 関連記事

ホットタグ

アーカイブ