セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 Windows サービスでリモート オブジェクトをホストする方法
J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy
Microsoft Corporation
November 2002
日本語版最終更新日 2003 年 3 月 17 日
Microsoft® ASP.NET
Microsoft Visual Studio® .NET
Microsoft Windows® 2000
全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。
要約 : .NET リモート処理インフラストラクチャを通じて呼び出されるオブジェクトは、ASP.NET、カスタム実行可能ファイル、または Windows サービスでホストすることができます。ここでは、リモート オブジェクトを Windows サービスでホストし、ASP.NET Web アプリケーションから呼び出す方法について述べます。
目次
ここでは、Windows サービスでリモート オブジェクトをホストし、ASP.NET Web アプリケーションから呼び出す方法について述べます。
メモ
リモート オブジェクト (つまり、.NET リモート処理技術によるリモート アクセスが可能なオブジェクト) は、Windows サービス、カスタム実行可能ファイル、または ASP.NET でホストできます。
カスタム実行可能ファイルまたは Windows サービスでホストされているリモート オブジェクトとクライアントの間の通信には、TCP チャネルが使用されます。
ASP.NET でホストされているリモート オブジェクトとクライアントの間の通信には、HTTP チャネルが使用されます。
セキュリティを最重視する場合は、オブジェクトを ASP.NET でホストし、HTTP チャネルを使用します。これにより、ASP.NET と IIS に用意されているセキュリティ機能を活かすことができます。
IIS と ASP.NET の組み合わせでリモート オブジェクトをホストする方法については、Microsoft サポート技術情報の Knowledge Base の文書 312107「HOW TO: Host a Remote Object in Microsoft Internet Information Services」(英語情報) を参照してください。
パフォーマンスを最重視する場合は、オブジェクトを Windows サービスでホストし、TCP チャネルを使用します。この場合は、セキュリティが最初から組み込まれているわけではありません。
必要条件
ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、スキル、知識、サービス パックの要件は、以下のとおりです。
- Microsoft® Windows® 2000 オペレーティング システム
- Microsoft Visual Studio® .NET 開発システム
また、ここで説明する手順には、Microsoft Visual C#® 開発ツールの知識も必要です。
要約
ここでは、次の手順について説明します。
- リモート オブジェクト クラスを作成する。
- Windows サービス ホスト アプリケーションを作成する。
- サービスの実行に使用する Windows アカウントを作成する。
- Windows サービスをインストールする。
- テスト クライアント アプリケーションを作成する。
1. リモート オブジェクト クラスを作成する
この手順では、単純なリモート オブジェクト クラスを作成します。このリモート オブジェクト クラスには、メソッドが 1 つだけあります。2 つの数の合計を返す Add メソッドです。
■ リモート オブジェクト クラスを作成する
- Visual Studio .NET を起動し、"RemoteObject" という名前の新しい Visual C# クラス ライブラリ プロジェクトを作成します。
- ソリューション エクスプローラを使って、名前を class1.cs から Calculator.cs に変更します。
- Calculator.cs 内で、クラス名 Class1 と Calculator に変更し、既定コンストラクタの名前も同様に変更します。
- MarshalByRefObject から Calculator クラスを派生させ、クラスをリモート対応にします。
public class Calculator : MarshalByRefObject
- Calculator クラスに次のパブリック メソッドを追加します。
public int Add( int operand1, int operand2 )
{
return operand1 + operand2;
}
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
2. Windows サービス ホスト アプリケーションを作成する
この手順では、リモート オブジェクトをホストするための Windows サービス アプリケーションを作成します。このサービスを開始すると、TCP リモート処理チャネルがクライアント要求をリッスンするように構成されます。
メモ この手順では、インストーラ クラスと Installutil.exe コマンド ライン ユーティリティを使用して、Windows サービスをインストールします。サービスをアンインストールするには、Installutil.exe を /u スイッチ付きで実行します。また、セットアップおよび展開用のプロジェクトを Windows サービスのインストールとアンインストールに役立てることもできます。
■ Windows サービス ホスト アプリケーションを作成するには
作業中のソリューションに "RemotingHost" という名前のVisual C# Windows サービス プロジェクトを追加します。
ソリューション エクスプローラを使って、名前を Service1.cs から RemotingHost.cs に変更します。
RemotingHost.cs 内で、クラス名を "Service1" から "HostService" に変更し、既定コンストラクタの名前も同様に変更します。
ファイル先頭の既存の using ステートメントの下に、次の using ステートメントを追加します。
using System.Runtime.Remoting;
- Main メソッドを探し、ServicesToRun 変数を初期化する既存のコード行を次のコード行で置き換えます。
ServicesToRun = new System.ServiceProcess.ServiceBase[] {
new HostService() };
- InitializeComponent メソッドを探し、ServiceName プロパティを RemotingHost に設定します。
this.ServiceName = "RemotingHost";
- OnStart メソッドを探し、次のコード行を追加してリモート処理を構成します。構成ファイルの完全修飾パスが、開始パラメータとしてサービスに渡されます。
RemotingConfiguration.Configure(args[0]);
新しい C# クラス ファイルをプロジェクトに追加し、名前を HostServiceInstaller に変更します。
System.Configuration.Install.dll アセンブリへのアセンブリ参照を追加します。
HostServiceInstaller の先頭の既存の using ステートメントの下に、次の using ステートメントを追加します。
using System.ComponentModel;
using System.ServiceProcess;
using System.Configuration.Install;
- Installer クラスから HostServiceInstaller クラスを派生させます。
public class HostServiceInstaller : Installer
- 次に示すように、クラス レベルで RunInstaller 属性を適用します。
[RunInstaller(true)]
public class HostServiceInstaller : Installer
- HostServiceInstaller クラスに、次の 2 つのプライベート メンバ変数を追加します。オブジェクトは、サービスのインストール時に使用されます。
private ServiceInstaller HostInstaller;
private ServiceProcessInstaller HostProcessInstaller;
- HostServiceInstaller クラスのコンストラクタに次のコードを追加します。
HostInstaller = new ServiceInstaller();
HostInstaller.StartType = System.ServiceProcess.ServiceStartMode.Manual;
HostInstaller.ServiceName = "RemotingHost";
HostInstaller.DisplayName = "Calculator Host Service";
Installers.Add (HostInstaller);
HostProcessInstaller = new ServiceProcessInstaller();
HostProcessInstaller.Account = ServiceAccount.User;
Installers.Add (HostProcessInstaller);
ソリューション エクスプローラ内で [RemotingHost] を右クリックし、[追加] をポイントして、[新規アイテムの追加] をクリックします。
[テンプレート] ボックスの一覧で、[テキスト ファイル] をクリックし、ファイル名として「app.config」を入力します。
app.config というファイル名の構成ファイルがビルド プロセス中に Visual Studio .NET によって出力フォルダ (例 : <projectdir>\bin\debug) にコピーされ、<applicationname>.config というファイル名に変更されます。
[OK] をクリックして新しい構成ファイルを追加します。
新しい構成ファイルに以下の構成要素を追加します。
<configuration>
<system.runtime.remoting>
<application name="RemoteHostService">
<service>
<wellknown type="RemoteObject.Calculator, RemoteObject"
objectUri="RemoteObject.Calculator" mode="Singleton" />
</service>
<channels>
<channel ref="tcp" port="8085">
<serverProviders>
<formatter ref="binary" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
3. サービスの実行に使用する Windows アカウントを作成する
この手順では、Windows サービスの実行に使用する Windows アカウントを作成します。
■ サービスの実行に使用する Windows アカウントを作成するには
- RemotingAccount という名前の新しいローカル ユーザー アカウントを作成します。パスワードを入力し、[パスワードを無期限にする] チェック ボックスをオンにします。
- [管理ツール] プログラム グループで、[ローカル セキュリティ ポリシー] をクリックします。
- [ローカル セキュリティ ポリシー] ツールを使って、新しいアカウントに [サービスとしてログオン] 特権を付与します。
4. Windows サービスをインストールする
この手順では、installutil.exe ユーティリティを使って Windows サービスをインストールした後、サービスを開始します。
■ Windows サービスをインストールするには
コマンド ウィンドウを開き、RemotingHost プロジェクト フォルダの下層にある Bin\Debug ディレクトリに移動します。
installutil.exe ユーティリティを実行してサービスをインストールします。
installutil.exe remotinghost.exe
「3. サービスの実行に使用する Windows アカウントを作成する」の手順で作成したアカウントのユーザー名とパスワードを [サービス ログインの設定] ダイアログ ボックスに入力し、[OK] をクリックします。
installutil.exe ユーティリティの出力を表示し、サービスが正しくインストールされていることを確認します。
RemoteObject.dll アセンブリを RemotingHost プロジェクト出力ディレクトリ (つまり、RemotingHost\Bin\Debug) にコピーします。
[管理ツール] プログラム グループからサービス MMC スナップインを起動します。
[サービス] ボックスの一覧で [Calculator Host Service] を右クリックし、[プロパティ] をクリックします。
サービスの構成ファイル (remotinghost.exe.config) のフル パスを [開始パラメータ] ボックスに入力します。
メモ 上記の代わりに、[実行パス] ボックスを選択してコピーし、[開始パラメータ] ボックスに貼り付けた後、".config" 文字列を追加すると、この設定をすばやく行うことができます。
[開始] をクリックしてサービスを開始します。
サービスの状態が [開始] に変化することを確認します。
[OK] をクリックして、[プロパティ] ダイアログ ボックスを閉じます。
5. テスト クライアント アプリケーションを作成する
この手順では、Windows サービス内でリモート オブジェクトを呼び出すテスト コンソール アプリケーションを作成します。
■ テスト クライアント アプリケーションを作成するには
- 作業中のソリューションに "RemotingClient" という名前の新しい Visual C# コンソール アプリケーションを追加します。
- ソリューション エクスプローラ内で、RemotingClient を右クリックし、[スタートアップ プロジェクトとして設定] をクリックします。
- System.Runtime.Remoting.dll アセンブリへのアセンブリ参照を追加します。
- RemoteObject プロジェクトへのプロジェクト参照を追加します。
- class1.cs の先頭の既存の using ステートメントの下に、次の using ステートメントを追加します。
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
- Main メソッドに次のテスト コードを追加します。このコードは、Windows サービスによってホストされる Calculator オブジェクトを呼び出します。
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
Calculator calc = (Calculator)Activator.GetObject(
typeof(RemoteObject.Calculator),
"tcp://localhost:8085/RemoteObject.Calculator");
if (calc == null)
System.Console.WriteLine("Could not locate server");
else
Console.WriteLine("21 + 21 is : " + calc.Add(21,21) );
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
- クライアント アプリケーションを実行し、正しい結果がコンソール出力ウィンドウに表示されることを確認します。
参考資料
IIS と ASP.NET の組み合わせでリモート オブジェクトをホストする方法については、Microsoft サポート技術情報の Knowledge Base の文書 312107「HOW TO: Host a Remote Object in Microsoft Internet Information Services」(英語情報) を参照してください。