次の方法で共有


.NET Framework のユーザー操作の基礎

更新 : 2007 年 11 月

.NET Framework では、System.Security.Principal 名前空間にロール ベース セキュリティが実装されています。アプリケーションでは、これを使用して、ユーザーの承認や認証を実行できます。このトピックでは、.NET Framework でアプリケーションの承認を扱う方法や、ユーザーを表す IIdentity オブジェクトおよび IPrincipal オブジェクトを作成する方法について解説します。

IIdentity は、認証されたユーザーをカプセル化します。IPrincipal は、ユーザーの ID と、そのユーザーが持つロールの組み合わせです。System.Security.Principal 名前空間で定義済みの ID クラスおよびプリンシパル クラスを使用することもできるし、これらのインターフェイスを実装するクラスを作成してカスタム認証を追加することもできます。

これらのインターフェイスを使用するには、インターフェイス名を完全修飾するか、または、関係するソース コード ファイルの先頭に Imports ステートメントを記述して、適切な名前空間をインポートする必要があります。詳細については、「Imports ステートメント (.NET 名前空間および型)」を参照してください。

.NET Framework アプリケーションでのロール ベース セキュリティの使用

各アプリケーション スレッドには、コードを実行中のユーザーのセキュリティ コンテキストを表すプリンシパル オブジェクトが関連付けられます (CurrentPrincipal プロパティでアクセス可能)。プリンシパル オブジェクトは、ユーザーのユーザー セキュリティ コンテキスト (つまり ID) オブジェクトをカプセル化します。2 つのオブジェクトがあるおかげで、認証 (ID オブジェクトによる) と承認 (プリンシパルによる) を分離できます。

ID オブジェクトは IIdentity インターフェイスを実装する必要があります。ID オブジェクトは、特定のユーザーを表し、IIdentity インターフェイスに必要な NameIsAuthenticated、および AuthenticationType の各プロパティを公開します。通常、ID オブジェクトには、ユーザー認証を実行するプライベート メンバが追加されています。

プリンシパル オブジェクトは IPrincipal インターフェイスを実装する必要があります。プリンシパル オブジェクトは、IPrincipal インターフェイスで必要なメンバを公開することにより、ユーザーのセキュリティ コンテキストをカプセル化します。そのメンバの 1 つは、承認を実行する IsInRole メソッドです。もう 1 つは、ユーザーの ID オブジェクトへのアクセスを提供する Identity プロパティです。

ID の操作

.NET Framework には、IIdentity インターフェイスを実装した、次の 4 つのクラスが用意されています。

各クラスでは、それぞれ異なる種類のユーザー ID を扱うことができます。Windows 認証を使用するアプリケーションの現在の WindowsIdentity オブジェクトにアクセスするには、WindowsIdentity クラスの GetCurrent 静的メソッドを使用します。また、My.User.InitializeWithWindowsUser メソッドを呼び出すと、現在のスレッドのプリンシパルを設定できます。

また、独自のカスタム クラスに IIdentity インターフェイスを実装することにより、カスタムの ID クラスを作成できます。カスタム ID を作成する方法の詳細については、「チュートリアル : カスタムの認証および承認の実装」を参照してください。

プリンシパルの操作

.NET Framework には、ユーザー ロールと ID をリンクさせるための IPrincipal インターフェイスが用意されています。アプリケーションで承認を実行する場合は、IPrincipal を実装したオブジェクトを使用する必要があります。たとえば、WindowsIdentity クラスや GenericIdentity クラスには、IPrincipal の実装が組み込まれています。または、IPrincipal を使用して、独自のカスタム プリンシパル クラスを作成することもできます。

IPrincipal オブジェクトをスレッドの CurrentPrincipal プロパティまたは My.User.CurrentPrincipal プロパティに割り当てると、現在のスレッドをこのオブジェクトにリンクできます。そして、ユーザーが特定のロールのメンバかどうか調べることにより、承認チェックを実行できます。それには、プリンシパルの IsInRole メソッドを使用します。

ASP.NET アプリケーションの場合は、IPrincipal オブジェクトの処理が、他の .NET Framework アプリケーションの場合と異なります。ASP.NET では、セッションの外観を、状態のない HTTP プロトコル上で作成します。このセッションの一部として、ユーザーの要求を実行するすべてのコードについて、ユーザーを表す IPrincipal オブジェクトを、HttpContext オブジェクトの User プロパティから利用できます。共通言語ランタイムは、Global.asax ファイルの OnAuthenticate イベントの後で、CurrentPrincipalUser の値で自動的に更新します。ASP.NET アプリケーションでは、User プロパティを使用して承認チェックを実行することがよくあります。

メモ :

User を手動で変更すると、同じ HTTP コンテキスト内で実行されているすべてのスレッドについて、CurrentPrincipal プロパティが自動的に更新されます。一方、CurrentPrincipal を変更しても、User プロパティには影響しません。影響が及ぶのは、当該スレッドのリクエストの残りの部分に対してのみです。

ASP.NET アプリケーションでは、My.User.CurrentPrincipal プロパティにより User プロパティが更新されます。

独自の IPrincipal 型の作成の詳細については、「チュートリアル : カスタムの認証および承認の実装」を参照してください。

IIdentity オブジェクトおよび IPrincipal オブジェクトを扱うためのアクセス許可の付与

IIdentity オブジェクトを扱うためのアクセス許可を与えるときには注意が必要です。これらのオブジェクトは、機密性の高いユーザー関連情報を利用できるようにするものだからです。アプリケーションの現在の IPrincipal オブジェクトが変更されないように保護する必要があります。アプリケーションの承認機能は、現在のプリンシパルに基づいて決まるからです。

.NET Framework では、この保護を実現するために、これらの操作にはコード アクセス セキュリティのアクセス許可が必要とされています。これらのオブジェクトを操作する必要のあるアプリケーションに対し、コード アクセス セキュリティ ポリシー ツール (Caspol.exe) を使用して SecurityPermissionAttribute.ControlPrincipal アクセス許可を与えます。

既定では、このアクセス許可は、ローカルにインストールされたアプリケーションすべてに対して与えられています。これらのアプリケーションは FullTrust アクセス許可セットの下で実行されるからです。

以下のメソッドを実行するには、ControlPrincipal アクセス許可が必要です。

参照

処理手順

チュートリアル : カスタムの認証および承認の実装

参照

My.User オブジェクト

その他の技術情報

Visual Basic での .NET Framework の認証と承認