それで、IIdentity
とIPrincipal
の両方の存在の目的は何であり、いくつかのIIdentityMergedWithPrincipal
ではありませんか?同じクラスで両方を実装するだけでは十分ではないのはいつですか?
また、目的を理解するために、この概念の由来を知りたいと思います。
System.Security.Principal
はそれらのインターフェイスに実装されますしたがって、System.DirectoryServices
からのUserPrincipal
はIPrincipal
と同様に機能しますが、偶然または意図的に実装しませんか?
追伸利益/論争の比較ではなく、アイデアの背後にある推論を探しているので、意見に基づく議論を開始しないようにしてください
IIdentity
は、ユーザーのロールに関係なく、ユーザーの認証済み IDにのみ使用されます。
IPrincipal
は、特定のセキュリティコンテキストでユーザーのIDをauthorizedロールと結合するために使用されます。
たとえば、FacebookやGoogleなどのサードパーティのログインプロバイダーを使用してユーザーのIDを取得できますが、ロールを提供しないため、これらのプロバイダーからプリンシパルを取得することはできません。独自のアプリケーションまたはサードパーティのロールベースの承認プロバイダーを使用して、FacebookIdentity
やGoogleIdentity
などにロールを適用できます。異なるアプリケーションは、独自の役割を持つ異なるプリンシパルを期待できますが、それでも別のアプリケーションと同じIDを使用します。
プリンシパルは、ユーザーのセキュリティコンテキストです。
.NETの場合、プリンシパルは複数のIDを持つという概念をサポートします(これはまだクレームとは関係ありません)。これは、ユーザーIDに関して開発者が対処する必要があるセマンティクスに関しては特に重要です。開発者として、たとえばTwitter、Googleなど、さまざまなソース(IDプロバイダーIdP)からの複数のIDをサポートするよう依頼される場合があります。
それでは、IPrincipalとIIDentityの違いは何ですか? IPrincipalはセキュリティコンテキスト(シングルスレッドの場合)であり、IIDentityは特定のIDプロバイダー/機関からのユーザーに関連付けられた属性のセットです。
MSDNサイト のように:
identityオブジェクトは、検証されるユーザーまたはエンティティに関する情報をカプセル化します。最も基本的なレベルでは、IDオブジェクトには名前と認証タイプが含まれています。
一方、
principalオブジェクトは、コードが実行されているセキュリティコンテキストを表します。
詳細については、上記のリンクを参照してください。
HTH