ロール ベース セキュリティ ポリシーおよびプリンシパルの設定
ロール ベース セキュリティは、実行時にコンポーネントが現在のユーザーとそれに関連付けられたロールを識別できるようにします。 識別された情報は、コード アクセス セキュリティ ポリシーを使って割り当てられ、実行時に付与するアクセス許可のセットを決定します。 指定したアプリケーション ドメインに対して、ホストで既定のロール ベース セキュリティ ポリシーを変更し、既定のセキュリティ プリンシパルを設定できます。 セキュリティ プリンシパルは、ユーザーと、そのユーザーに関連付けられたロールを表します。
一般に、ロール ベース セキュリティは、カスタム認証方式を実装するために使われます。 たとえば、ASP.NET ホストでは、ロール ベース セキュリティを使って、インターネット インフォメーション サービス (IIS: Internet Information Services) から取得するユーザー情報に基づく認証方式を実装しています。
ユーザーおよびユーザーのロールの定義は、アプリケーション固有です。 アプリケーションでは、Windows とは異なるユーザーの概念を定義できます。 たとえば、ユーザーがアプリケーションにログオンするときに、アプリケーションからユーザーに対してユーザー名とパスワードの入力を要求する場合があります。 このユーザー名とパスワードは、このユーザーが Windows にログオンするときに使用するユーザー名とパスワードとは無関係に設定できます。
スレッドに対して明示的にプリンシパルを設定する方法
スレッドのプリンシパルが設定済みの場合、アプリケーション ドメインのポリシーおよび既定のプリンシパルは無視されます。 たとえば、スレッドが Thread クラスの CurrentPrincipal 静的プロパティ (Visual Basic では Shared プロパティ) を使用して独自のプリンシパルを設定している可能性があります。 また、スレッドを起動したスレッドからプリンシパルを取得している可能性もあります。
メモ |
---|
.NET Framework Version 2.0 では、スレッドが別のスレッドを起動するか、スレッド プールを使用して実行するために作業項目をキューに入れると、子スレッドまたはスレッド プール スレッドに自動的に、セキュリティ プリンシパルを含むそのスレッドのコンテキストがフローします。.NET Framework Version 1.0 および 1.1 では、コンテキストはあるスレッドによって起動されたスレッドにのみフローし、スレッド プール スレッドにはフローしませんでした。 |
セキュリティ プリンシパルを持たないスレッドがプリンシパルを必要とするアクションを実行すると、現在のアプリケーション ドメインのセキュリティ ポリシーおよび既定のセキュリティ プリンシパルに基づいて、プリンシパルが設定されます。
メモ |
---|
セキュリティ プリンシパルを持たないスレッドが CurrentPrincipal 静的プロパティを使用して、自分のプリンシパルを照会すると、アプリケーション ドメインの既定値が使用されてプリンシパルが設定されます。つまり、CurrentPrincipal が null を返すことはありません。 |
アプリケーション ドメインのポリシーおよび既定のプリンシパル
ホストは、SetThreadPrincipal メソッドを呼び出すことによって、アプリケーション ドメインの既定のプリンシパルを設定できます。 既定のプリンシパルが指定されている場合は、そのアプリケーション ドメイン内で実行中の、プリンシパルを必要とし、まだプリンシパルを持たないすべてのスレッドに対してそのプリンシパルが設定されます。
メモ |
---|
スレッドにプリンシパルがない場合でも、SetThreadPrincipal を呼び出すスレッドに、自動的に既定のプリンシパルが適用されるわけではありません。そのスレッドが後でプリンシパルを必要とし、それまでの間にプリンシパルを取得していない場合に、そのときに実行中のアプリケーション ドメインの既定のプリンシパルおよびポリシーに従ってプリンシパルが設定されます。 |
そのアプリケーション ドメインに対して既定のプリンシパルが設定されていない場合、スレッドのプリンシパルは、アプリケーション ドメインのポリシーに従って設定されます。 既定では、アプリケーション ドメインのポリシーは、認証されていない汎用プリンシパルをスレッドに割り当てるためにあります。 ホストは、SetPrincipalPolicy メソッドを呼び出すことによって、アプリケーション ドメインのこのポリシーを変更できます。 たとえば、次のマネージ コードは、アプリケーション ドメインを作成し、現在の Windows プリンシパルを使用するようにそのポリシーを設定します。
Dim ad As AppDomain = AppDomain.CreateDomain("Child")
ad.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
AppDomain ad = AppDomain.CreateDomain("Child");
ad.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
AppDomain^ ad = AppDomain::CreateDomain("Child");
ad->SetPrincipalPolicy(PrincipalPolicy::WindowsPrincipal);
アンマネージ ホストは、vtable の順序を .NET Framework の異なるバージョン間で維持する _AppDomain インターフェイスを使用してアプリケーション ドメインにアクセスできます。