web-dev-qa-db-ja.com

.NETのIIdentityとIPrincipalの背後にある考え方は何ですか

それで、IIdentityIPrincipalの両方の存在の目的は何であり、いくつかのIIdentityMergedWithPrincipalではありませんか?同じクラスで両方を実装するだけでは十分ではないのはいつですか?

また、目的を理解するために、この概念の由来を知りたいと思います。

  • .Netに由来します
  • デザインパターンとしてIdentity/Principalの概念があり、System.Security.Principalはそれらのインターフェイスに実装されます
  • どこかで作成され、互換性のためにサポートされています

したがって、System.DirectoryServicesからのUserPrincipalIPrincipalと同様に機能しますが、偶然または意図的に実装しませんか?

追伸利益/論争の比較ではなく、アイデアの背後にある推論を探しているので、意見に基づく議論を開始しないようにしてください

43
Aloraman

IIdentityは、ユーザーのロールに関係なく、ユーザーの認証済み IDにのみ使用されます。

IPrincipalは、特定のセキュリティコンテキストでユーザーのIDをauthorizedロールと結合するために使用されます。

たとえば、FacebookやGoogleなどのサードパーティのログインプロバイダーを使用してユーザーのIDを取得できますが、ロールを提供しないため、これらのプロバイダーからプリンシパルを取得することはできません。独自のアプリケーションまたはサードパーティのロールベースの承認プロバイダーを使用して、FacebookIdentityGoogleIdentityなどにロールを適用できます。異なるアプリケーションは、独自の役割を持つ異なるプリンシパルを期待できますが、それでも別のアプリケーションと同じIDを使用します。

59
Mark Cidade

プリンシパルは、ユーザーのセキュリティコンテキストです。

.NETの場合、プリンシパルは複数のIDを持つという概念をサポートします(これはまだクレームとは関係ありません)。これは、ユーザーIDに関して開発者が対処する必要があるセマンティクスに関しては特に重要です。開発者として、たとえばTwitter、Googleなど、さまざまなソース(IDプロバイダーIdP)からの複数のIDをサポートするよう依頼される場合があります。

それでは、IPrincipalとIIDentityの違いは何ですか? IPrincipalはセキュリティコンテキスト(シングルスレッドの場合)であり、IIDentityは特定のIDプロバイダー/機関からのユーザーに関連付けられた属性のセットです。

13
Kevin

MSDNサイト のように:

identityオブジェクトは、検証されるユーザーまたはエンティティに関する情報をカプセル化します。最も基本的なレベルでは、IDオブジェクトには名前と認証タイプが含まれています。

一方、

principalオブジェクトは、コードが実行されているセキュリティコンテキストを表します。

詳細については、上記のリンクを参照してください。

HTH

10
Kamran