セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 Enterprise Servises でロールを基準としたセキュリティを使用する方法
J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy
Microsoft Corporation
November 2002
日本語版最終更新日 2003 年 3 月 17 日
Microsoft® ASP.NET
Microsoft Visual Studio® .NET
全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。
要約 : Enterprise Services (COM+) には認定を行うためのロールが用意されています。ここでは、ロールを基準としたメソッド レベルのセキュリティに必要なサービス コンポーネントを作成および構成する方法について説明します。
目次
ここでは、Enterprise Services (ES) ロールを使用して認定を行うシンプルなサービス コンポーネントを作成する方法について説明します。
メモ
- ES ロールと .NET ロールは異なります。
- ES ロールには Windows グループ アカウントまたは Windows ユーザー アカウントを格納できます。
- ES ロールは COM+ カタログで維持管理されます。
- ES ロールは (ES) アプリケーション、インターフェイス、クラス、またはメソッドの各レベルで適用できます。
- ES ロールの中には、サービス コンポーネントのアセンブリ内の .NET 属性を使用して宣言の形式で構成できるものがあります。
- Windows グループ アカウントおよびユーザー アカウントは、管理者が展開時に追加する必要があります。
- 管理者はコンポーネント サービス管理ツールまたはコンポーネント サービス管理スクリプトを使用できます。
- ASP.NET Web アプリケーションからロールを基準とした Enterprise Services セキュリティを効果的に使用するには、サービス コンポーネントを呼び出す前にその Web アプリケーションが Windows 認証を使用して、呼び出し側を偽装しなければなりません。
必要条件
ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、スキル、知識、サービス パックの要件としては、次のシステムが必要です。
- Microsoft® Visual Studio® .NET 開発システム
また、Microsoft Visual C#® 開発ツールを使用した ASP.NET Web 開発に関する知識も必要です。
要約
ここでは、次の手順について説明します。
- C# クラス ライブラリ アプリケーションを作成してサービス コンポーネントをホストする。
- サービス コンポーネントを作成する。
- サービス コンポーネントを構成する。
- アセンブリの厳密名を生成する。
- アセンブリをビルドし、グローバル アセンブリ キャッシュに追加する。
- サービス コンポーネントを手動で登録する。
- 構成済みのアプリケーションを確認する。
- テスト用のクライアント アプリケーションを作成する。
1. C# クラス ライブラリ アプリケーションを作成してサービス コンポーネントをホストする
ここでは、サービス コンポーネントを格納する新しい C# クラス ライブラリ アプリケーションを作成します。
■ サービス コンポーネントをホストする C# クラス ライブラリ アプリケーションを作成するには
- Visual Studio .NET を起動し、"ServicedCom" という名前で新しい C# クラス ライブラリを作成します。
- 既定のクラス ファイル Class1.cs の名前を SimpleComponent.cs に変更します。
- SimpleComponent.cs をダブルクリックして開き、"Class1" を "SimpleComponent" に変更します。また、このクラスの既定のコンストラクタ名も変更してください。
2. サービス コンポーネントを作成する
ここでは、EnterpriseServices.ServicedComponent クラスを継承することによって SimpleComponent クラスをサービス コンポーネントにします。次に、インターフェイスを作成し、SimpleComponent クラス内で実装します。インターフェイスおよびメソッド レベルのセキュリティを使用するには、インターフェイスを定義して実装しなければなりません。
■ サービス コンポーネントを作成するには
- System.EnterpriseServices アセンブリへの参照を追加します。
- SimpleComponent.cs ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using System.EnterpriseServices;
- ServicedComponent から SimpleComponent クラスを継承します。
public class SimpleComponent : ServicedComponent
- 次のインターフェイス定義を ServicedCom 名前空間に追加します。
public interface ISomeInterface
{
int Add( int operand1, int operand2 );
}
- このインターフェイスから SimpleComponent を継承します。
public class SimpleComponent : ServicedComponent, ISomeInterface
- SimpleComponent クラス内でインターフェイスを次のように実装します。
public int Add( int operand1, int operand2 )
{
return operand1 + operand2;
}
3. サービス コンポーネントを構成する
ここでは、ロールを基準としたメソッド レベルのセキュリティに必要なサービス コンポーネントを構成します。
■ サービス コンポーネントを構成するには
- 次の属性を SimpleComponent クラスのすぐ上に追加します。ComponentAccessControl 属性を使用するとコンポーネント レベルのアクセス チェックが可能になり、SecureMethod 属性を使用するとメソッド レベルのアクセス チェックが可能になります。
[ComponentAccessControl]
[SecureMethod]
public class SimpleComponent : ServicedComponent, ISomeInterface
- 次の属性を Add メソッドの上に追加して Manager ロールを作成し、このメソッドに関連付けます。
[SecurityRole("Manager")]
public int Add( int operand1, int operand2 )
{
return operand1 + operand2;
}
- assemblyinfo.cs を開き、ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using System.EnterpriseServices;
- ファイルの最後に移動して次の属性を追加します。サービス コンポーネントをホストする Enterprise Services アプリケーションは、これらの属性を使用して構成します。
// Configure the application as a server (out-of-process) application
[assembly: ApplicationActivation(ActivationOption.Server)]
// For meaningful role-based security, enable access checking at the process
// and component levels by using the following .NET attribute.
[assembly: ApplicationAccessControl(AccessChecksLevel=
AccessChecksLevelOption.ApplicationComponent)]
// Set the name and description for the application
[assembly: ApplicationName("SimpleRoles")]
[assembly: Description("Simple application to show ES Roles")]
// Add some additional roles
[assembly:SecurityRole("Employee")]
[assembly:SecurityRole("Senior Manager")]
4. アセンブリの厳密名を生成する
サービス コンポーネントをホストするアセンブリには厳密名を付ける必要があります。ここでは、アセンブリの厳密名を付けるときに使用する公開キーと秘密キーのペアを生成します。
■ アセンブリの厳密名を生成するには
- コマンド プロンプト ウィンドウを開き、現在のプロジェクトのディレクトリに移動します。
- sn.exe ユーティリティを使用して、公開キーと秘密キーのペアを格納するキー ファイルを生成します。
sn.exe -k SimpleComponent.snk
- Visual Studio で、assemblyinfo.cs を開きます。
- [AssembleKeyFile] 属性を探し、プロジェクト ディレクトリ内でキー ファイルの参照を行うよう次のように変更します。
[assembly: AssemblyKeyFile(@"..\..\SimpleComponent.snk")]
5. アセンブリをビルドし、グローバル アセンブリ キャッシュに追加する
ここでは、サービス コンポーネントを格納するアセンブリをビルドし、それをグローバル アセンブリ キャッシュに追加します。サービス コンポーネントはシステム レベルのリソースであるため、通常はグローバル アセンブリ キャッシュに登録する必要があります。COM+ サーバー アプリケーションでホストされるサービス コンポーネントはグローバル アセンブリ キャッシュにインストールする必要がありますが、ライブラリ アプリケーションでホストされるサービス コンポーネントについてはインストールの必要はありません (必要はありませんが、インストールすることを強くお勧めします)。
■ アセンブリをビルドしてグローバル アセンブリ キャッシュに追加するには
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
- コマンド プロンプト ウィンドウに戻り、次のコマンドを実行します。アセンブリがグローバル アセンブリ キャッシュに追加されます。
gacutil -i bin\debug\ServicedCom.dll
6. サービス コンポーネントを手動で登録する
サービス コンポーネントは Regsvcs.exe ツールを使って手動で登録することも、動的登録機能で自動登録することも可能です。動的登録機能を使用すると、最初にサービス コンポーネントのインスタンスが作成されたときに、そのコンポーネント (およびメタ データを使用して作成および構成されたコンポーネントをホストする COM+ アプリケーション) が登録されます。
この自動登録によるパフォーマンスの一時的な低下を避けるには、以下に示す手順に従ってサービス コンポーネントを手動で登録します。
■ サービス コンポーネントを手動で登録するには
- コマンド プロンプト ウィンドウに戻ります。
- regsvcs.exe を実行して、コンポーネントを登録します。
regsvcs bin\debug\ServicedCom.dll
7. 構成済みのアプリケーションを確認する
ここでは、コンポーネント サービス ツールを使用して、.NET で以前使用していた属性を継承して作成したカタログ設定を確認します。
■ 構成済みのアプリケーションを確認するには
- プログラム メニューの [管理ツール] から [コンポーネント サービス] を起動します。
- [コンポーネント サービス]、[コンピュータ]、[マイ コンピュータ]、[COM+ アプリケーション] の順に展開します。
- [SimpleRoles] を右クリックし、[プロパティ] をクリックします。
- [セキュリティ] タブをクリックし、[このアプリケーションへのアクセス チェックを行う] チェック ボックスがオンになっていること、および、プロセス レベルおよびコンポーネント レベルでアクセス チェックを実行するようにセキュリティ レベルが設定してあることを確認します。この構成は、.NET で以前使用していた属性から受け継がれたものです。
- [OK] をクリックして、プロパティ ダイアログ ボックスを閉じます。
- [SimpleRoles] アプリケーション、[コンポーネント] フォルダ、[ServicedCom.SimpleComponent] クラスの順に展開します。
- インターフェイス フォルダの ISomeInterface メソッドの下にある Add メソッドに移動します。
- [Add] を右クリックし、[プロパティ] をクリックします。
- [セキュリティ] タブをクリックし、[Manager] ロールがメソッドに関連付けられていることを確認します。
- [OK] をクリックして、[プロパティ] ダイアログ ボックスを閉じます。
- [SimpleRoles] アプリケーションの下の [ロール] フォルダを展開します。.NET 属性を使用して以前作成したロールに注目してください。また、[Marshaler] ロールにも注目してください。このロールは、[SecureMethod] 属性を追加したことにより作成され、メソッド レベルのセキュリティに必要です。
8. テスト用のクライアント アプリケーションを作成する
ここでは、Windows フォームをベースにしたテスト用クライアント アプリケーションを作成し、サービス コンポーネントをインスタンス化して呼び出します。
■ テスト用クライアント アプリケーションを作成するには
現在のソリューションに "TestClient" という新しい C# Windows アプリケーションを追加します。
ServicedCom プロジェクトへの新しいプロジェクト参照を追加します。
- ソリューション エクスプローラで、[参照設定] を右クリックし、[参照の追加] をクリックします。
- [プロジェクト] タブをクリックします。
- [ServicedCom] をクリックし、[選択] をクリックします。次に、[OK] をクリックします。
System.EnterpriseServices への参照を追加します。
アプリケーションのメイン フォームにボタンを 1 つ追加します。
ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
form1.cs の先頭の既存の using ステートメントの下に、次の using ステートメントを追加します。
using ServicedCom;
- ボタン クリック イベント ハンドラに戻り、次のコードを追加してサービス コンポーネントをインスタンス化して呼び出します。
SimpleComponent comp = new SimpleComponent();
MessageBox.Show( "Result is: " + comp.Add(1, 2));
[ビルド] メニューの [ソリューションのビルド] をクリックします。
ソリューション エクスプローラで、TestClient プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] をクリックします。
Ctrl キーを押しながら F5 キーを押して、TestClient アプリケーションを実行します。
ハンドルされていない例外が発生したことを示すメッセージが表示されます。
メッセージ ボックスの [詳細] ボタンをクリックし、例外の詳細を表示します。
System.UnauthorizedAccessException が生成されたことがわかります。これは、TestClient アプリケーションの実行に使用した対話型ログオン アカウントが Manager ロールのメンバでなかったためです。サービス コンポーネント上の Add メソッドを呼び出すには、このロールのメンバである必要があります。
[終了] をクリックして、アプリケーションを終了します。
コンポーネント サービスに戻って、現在の (対話型) アカウントを Manager ロールと Marshaler ロールに追加します。
メモ Enterprise Services インフラストラクチャは、ImanagedObject、Idisposable、IserviceComponentInfo などのシステム レベルのインターフェイスを複数使用しており、すべてのサービス コンポーネントがこれらのインターフェイスを公開しています。しかし、インターフェイス レベルまたはメソッド レベルでアクセス チェックを行うように設定されていると、Enterprise Services インフラストラクチャはこれらのインターフェイスにアクセスできません。
このため、Enterprise Services は、"Marshaler" という名前の特別なロールを作成し、これらのインターフェイスに Marshaler ロールを関連付けます。アプリケーション管理者は、クラスのメソッドまたはインターフェイスすべてにアクセスする必要があるすべてのユーザーを、展開時に Marshaler ロールに追加することが必要です。この作業は、2 とおりの方法で自動的に行うことができます。
- コンポーネント サービス オブジェクト モデルを使用して他のロールに割り当てられているすべてのユーザーを Marshaler ロールにコピーするスクリプトを記述する。
- 他のすべてのロールをこの 3 つの特別なインターフェイスに割り当てるスクリプトを記述して、Marshaler ロールを削除する。
SimpleRoles アプリケーションを終了し、加えた変更を有効にします。有効にするには、アプリケーション名を右クリックし、[シャットダウン] をクリックします。
Visual Studio .NET に戻り、Ctrl キーを押しながら F5 キーを押し、TestClient アプリケーションを再度実行します。
フォームのボタンをクリックし、メソッドが正しく呼び出されたことを確認します。