.NETでのアイデンティティについて話すとき、私たちは プリンシパル という考えを持っています。インターフェースがあります IPrincipal
そしてそれと一緒に実装 ClaimsPrincipal
。 Thread.CurrentPrincipal
を使用して、いつでもそのインターフェイスの実装の1つのインスタンスにアクセスできます。
今、私はこのプリンシパルが実際に何であるかを理解していませんでした。確かに、最初はそれが現在のユーザーのアイデンティティを表すものだと思いました。しかし、実際にはそうではありません IIdentity
実装と一緒に ClaimsIdentity
そのために。少し検索すると、MSDNで次のことがわかりました。
プリンシパルオブジェクトは、コードが実行されているユーザーのセキュリティコンテキストを表します。これには、ユーザーのID(IIdentity)やユーザーが属するロールが含まれます。
しかし、これはコードを実行しているユーザーのセキュリティコンテキストは実際にはどういう意味ですか?これが何を表しているのかまだわからなかったと思います。
リソースへのアクセスまたはコードを実行する機能を承認する場合、アクションを承認しているユーザーを知るだけでなく、どのユーザーがアクションを承認しているかを知るだけで十分です。
これは、シェルを昇格する場合とほぼ同等であると考えてください。プリンシパルのIDが同じ(ユーザーアカウント)であっても、シェルは別のプリンシパル(より多くの特権)で実行されます。
IIdentity
タイプは、authenticationの問題に焦点を当てています。つまり、システムに認識されているIDが、そのIDの下で動作したいエージェントに実際に属していることを確認します。これは何かを承認するために必要な前提条件ですが、すべてではありません。
プリンシパルは、IDとロールをカプセル化する抽象的なものであり、したがって、コードが実行されているセキュリティコンテキストです。これは、Windows ID(つまり、WindowsまたはActive Directoryユーザーアカウント)とWindows「ロール」(別名「グループ」)の場合もあれば、Windowsユーザーとロールから独立しているが、複数のユーザーで引き続き使用できるID /ロールの場合もあります。アプリケーション。第3に、アプリケーション内でのみ定義されるIDとロールのカスタム概念にすることもできます。
セキュリティコンテキストは静的なものではありません。プリンシパルの役割を調整し、セキュリティコンテキストで実行されているID(ユーザー)とアプリケーションに与える特権を増減することで変更できます。
これについてさらに学ぶために始めるのに適した場所は次のとおりです。 https://msdn.Microsoft.com/en-us/library/z164t8hs.aspx
説明によると、プリンシパルはアイデンティティと役割です。
それは実際には同じくらい単純なものです
public interface IPrincipal
{
IIdentity Identity { get; }
bool IsInRole( string role );
}
それを抽象化するというアイデアは非常に重要でした。当初は実装がほとんどありませんでしたが(WindowsPrincipal
、RolePrincipal
、GenericPrincipal
を含む)、後で他の実装が導入されました(たとえば、ClaimsPrincipal
)。また、レガシーコードの多くは、他に何も変更することなく、すべての利点を備えた新しい実装にシームレスにアップグレードできます。
プリンシパルは、ユーザーのIDと役割を表し、ユーザーに代わって動作します。
ソース: https://docs.Microsoft.com/en-us/dotnet/standard/security/key-security-concepts