COM+ ロール ベース セキュリティと .NET Framework
.NET Framework は、マネージ コードを COM+ セキュリティ サービスに統合するための機構を備えています。この機能は、実行コードに関連付けられた Windows NT トークンを ID のベースとして利用します。
ロール ベース セキュリティ
ロール ベース セキュリティを使用するとアプリケーションのロールを定義できるため、コンポーネント、メソッド、またはインターフェイスのいずれかのレベルでのアプリケーションに対する認証が、これらのロール内のメンバシップに基づいて実行されます。COM+ および .NET Framework のどちらを使用しても、アプリケーションレベルのロールを定義できます。.NET Framework および COM+ のロール ベース セキュリティの機構はそれぞれ独立しているため、1 つのアプリケーション内で使用できるのは 1 つの機構のみです。
COM+ セキュリティでは、Windows NT アカウントとプロセス/スレッドの偽装が利用されます。マネージ コードに認証サービスがある場合は、マネージ コードは Windows NT セキュリティ トークンを取得し、COM オブジェクトを呼び出す前に偽装を実行する必要があります。
アプリケーションとコンポーネントのアクセス制御
COM+ では、アプリケーション レベルまたはクラス レベルのいずれかでセキュリティを有効にできます。次のコード例で示すように、アプリケーション レベルのセキュリティは、ApplicationAccessControlAttribute 属性を使用して設定されます。
[assembly: ApplicationAccessControl (AccessChecksLevel=AccessChecksLevelOption. ApplicationComponent)]
Application または ApplicationComponent プロパティを使用して、アプリケーションに対するアクセス チェックの粒度を構成します。前者では、アプリケーション レベルのみのアクセス チェックが有効になります。コンポーネント、インターフェイス、メソッドなどの各レベルでアクセス許可をチェックしません。呼び出し元が、アプリケーションで定義されているロールのメンバであれば、あらゆるオブジェクト、インターフェイス、またはメソッドの呼び出しは正常に行われます。後者では、あらゆるレベルでのアクセス チェックが有効になります。ApplicationComponent では、ロール ベースのアクセス チェックがコンポーネント、インターフェイス、およびメソッド レベルで適用されるため、ApplicationComponent を使用する方が有用です。
ApplicationComponent プロパティを使用すると、コンポーネント レベルのアクセス チェックのみが有効になります。実際に、アクセス チェックが特定のコンポーネントに対して実行されるようにするには、ComponentAccessControlAttribute 属性を使用する必要があります。
コンポーネント レベルのセキュリティは、ComponentAccessControlAttribute 属性を使用して有効にできます。この属性は、クラス (次のコード例を参照)、インターフェイス、メソッドに適用できます。
[ComponentAccessControl(true)]
public class CreditAccount : ServicedComponent
{
}
コンポーネントに対してセキュリティを設定する前に、コンポーネントをホストするアプリケーションに対してセキュリティを有効にする必要があります。ApplicationAccessControlAttribute 属性をアセンブリに適用し、ApplicationAccessControlAttribute 属性を ApplicationComponent に設定した場合に限り、アクセス チェックが行われます。
セキュリティ制御が有効化されているレベルによって、呼び出し元のロールのメンバ シップがチェックされるタイミングが決定されます。次の表では、アプリケーションのセキュリティまたはコンポーネントのセキュリティのどちらが有効化されているかに応じて、呼び出し元のロールのメンバシップが確認される方法を説明しています。
アプリケーションのセキュリティ | コンポーネントのセキュリティ | ロールのメンバシップが確認されるタイミング |
---|---|---|
有効 |
無効 |
ロールのメンバシップは、呼び出し元がアプリケーションにアクセスするたびに確認されます。 |
有効 |
有効 |
ロールのメンバシップは、アプリケーション レベルのアクセス チェックに加えて、クラス レベルのセキュリティが有効なすべてのクラスに対して確認されます。コンポーネント レベルの設定によって、クラス、インターフェイス、およびメソッド レベルでのロール ベース セキュリティが有効になります。 |
無効 |
有効/無効 |
アプリケーション内のすべてのクラスでセキュリティが無効になります。 |
アプリケーションへのロールの追加
次のコード例で示すように、SecurityRoleAttribute 属性を使用して、アプリケーションにロールを追加し、そのロールをコンポーネントと関連付けることができます。
[SecurityRole("Teller", Description="Bank teller role")]
public class CreditAccount : ServicedComponent
{
}
この属性を使用すると、ロールを作成して、そのロールをアプリケーション、コンポーネント、インターフェイス、またはメソッドのメンバシップ要件に割り当てることができます。この属性をアセンブリ全体に適用すると、ロールが COM+ カタログ内が存在するようになります。この属性をコンポーネントに適用すると、ロールがアプリケーション構成に存在し、対象のコンポーネントがそのロールに関連付けられるようになります。
SetEveryoneAccess プロパティを true に設定すると、ロール Everyone がメンバとして追加されます。既定値は false です。つまり、ユーザーはロールに割り当てられていません。代わりに、手動でユーザーを設定する必要があります。
セキュリティ ロールは、アセンブリ、クラス、メソッド、およびインターフェイス レベルでサポートされます。その他のメソッド属性の場合と同様に、現在、セキュリティ構成はインターフェイス定義とメソッド実装間で共有されません。
SecurityCallContext クラスを使用すると、COM+ セキュリティ呼び出しコンテキストにアクセスできます。これは、Visual Basic の SecurityCallContext オブジェクトと似ていますが同一ではありません。新しいインスタンスはプログラムで作成されず、CurrentCall プロパティを介して取得されます。次の表示で説明するその他のプロパティでは、SecurityCallContext オブジェクトのメソッドを呼び出します。
プロパティ | 解説 |
---|---|
Callers |
COM+ の SecurityCallContext オブジェクトから Callers 項目を取得し、その項目を SecurityCallers オブジェクトとして返します。 |
CurrentCall |
現在の呼び出しに関連付けられている SecurityCallContext オブジェクトへの参照を返します。 |
DirectCaller |
COM+ の SecurityCallContext オブジェクトから DirectCaller 項目を取得し、その項目を SecurityIdentity オブジェクトとして返します。 |
MinAuthenticationLevel |
COM+ の SecurityCallContext オブジェクトから MinAuthenticationLevel 項目を取得します。 |
NumCallers |
COM+ の SecurityCallContext オブジェクトから NumCallers 項目を取得します。 |
OriginalCaller |
COM+ の SecurityCallContext オブジェクトから OriginalCaller 項目を取得し、その項目を SecurityIdentity オブジェクトとして返します。 |
関連項目
参照
SecurityRoleAttribute
System.EnterpriseServices
概念
Copyright © 2007 by Microsoft Corporation.All rights reserved.