TCP チャネルでの認証
TCP チャネルは、認証と偽装を直接サポートします。ここでは、クライアント チャネルとサーバー チャネルを構成する方法について説明します。
.NET Framework では、関連付けられた TcpServerChannel オブジェクトおよび TcpClientChannel オブジェクトのプロパティを設定することによって、リモート オブジェクトのサーバーが呼び出し元を認証したり偽装したりできるようにします。
サーバーの構成
TCP サーバー チャネルを構成して、リモートの呼び出し元を認証するには、次の構成ファイルに示すように、TCP チャネル上で、secure プロパティを true に設定します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" secure="true" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
メモ : |
---|
通信のセキュリティを保護するには、クライアント チャネルの secure プロパティも true に設定する必要があります。既定では、セキュリティで保護された通信では、サーバーとクライアントとの間で送信されるデータの認証と暗号化が行われます。 |
認証されたクライアントの ID は、CurrentPrincipal を取得して、Identity プロパティにアクセスすることによってアクセスできます。偽装されたクライアントの ID は GetCurrent によってアクセスできます。その後、必要に応じて、独自の承認を実行できます。
TCP サーバー チャネルを構成して、リモートの呼び出し元を認証および偽装するには、次の構成ファイルに示すように、secure プロパティと impersonate プロパティを true に設定します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" secure="true" impersonate="true" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
メモ : |
---|
偽装を実行するには、クライアント チャネルの tokenImpersonationLevel プロパティを impersonation または delegation に設定する必要があります。サーバー上ではこのプロパティは impersonate という名前ですが、クライアント上では tokenImpersonationLevel を impersonation に設定します。 |
メモ : |
---|
すべてのプロセスが Windows Vista の標準のユーザー アカウントを使用して実行されます。標準のユーザーは管理者アカウントを偽装できません。管理者アカウントを偽装する必要があるリモート処理アプリケーションがある場合、そのアプリケーションは管理者特権で実行する必要があります。 |
authorizationModule プロパティを使用すると、サーバーはサーバー自体の承認を行うことができます。このプロパティを使用するには、IAuthorizeRemotingConnection を実装するクラスを作成する必要があります。このインターフェイスには、次のメソッドが含まれています。
IsConnectingEndpointAuthorized : IP アドレスを使用してクライアントを承認できます。
IsConnectingIdentityAuthorized : ID を使用してクライアントを承認できます。
サーバーの構成ファイルでは、次の構成ファイルに示すように、authorizationModule プロパティを "namespace.class, assembly" という形式の文字列で IAuthorizeRemotingConnection を実装するクラスに設定します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application name="AuthorizationApp">
<service>
<wellknown mode="SingleCall"
type="Server.SampleService, Server"
objectUri="Server.rem"/>
</service>
<channels>
<channel ref="tcp" port="8001" secure="true" impersonate="true" authorizationModule="Server.AuthorizationModule,Server"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
クライアントの構成
TCP クライアント チャネルを構成して、呼び出し元を認証するには、次の構成ファイルに示すように、TCP チャネル上で、secure プロパティを true に設定します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" secure="true" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
メモ : |
---|
通信のセキュリティを保護するには、サーバー チャネルの secure プロパティも true に設定する必要があります。既定では、セキュリティで保護された通信では、サーバーとクライアントとの間で送信されるデータの認証と暗号化が行われます。 |
TCP クライアント チャネルを構成して偽装を使用するには、次の構成ファイルに示すように、secure プロパティを true に設定し、tokenImpersonationLevel プロパティを impersonation に設定します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
メモ : |
---|
偽装を実行するには、サーバー チャネルの impersonate プロパティを true に設定する必要があります。サーバー上ではこのプロパティは impersonate という名前ですが、クライアント上では tokenImpersonationLevel は impersonation に設定されます。 |
メモ : |
---|
すべてのプロセスが Windows Vista の標準のユーザー アカウントを使用して実行されます。標準のユーザーは管理者アカウントを偽装できません。管理者アカウントを偽装する必要があるリモート処理アプリケーションがある場合、そのアプリケーションは管理者特権で実行する必要があります。 |
tokenImpersonationLevel は、次の表のいずれかの値に設定できます。
tokenImpersonationLevel の設定 | 説明 |
---|---|
Identification |
サーバーは、セキュリティ ID や特権などのクライアント情報を取得できますが、クライアントを偽装できません。 |
Impersonation |
サーバーは、ローカル システム上にあるクライアントのセキュリティ コンテキストを偽装できます。サーバーは、リモート システムにあるクライアントを偽装できません。 |
Delegation |
サーバーは、リモート システムにあるクライアントを偽装できます。 |
既定では、TCP クライアント チャネルは、クライアントの処理の実行に使用されるユーザー ID でそれ自体を認証します。次のコード例に示すように、domain、username、および password プロパティを設定することによって代替 ID を指定できます。
RemotingConfiguration.Configure("Client.exe.config", true);
ISharedInterface remoteObject = (ISharedInterface)Activator.GetObject(
typeof(ISharedInterface),
"tcp://localhost:8001/server.rem");
// Set domain, username, and password
IDictionary props = ChannelServices.GetChannelSinkProperties(remoteObject);
props["domain"] = "SomeDomain"; // only required if the user is a member of a domain
props["username"] = "SomeRemotingUser";
props["password"] = "Password123";
// Call method on remote object
remoteObject.HelloWorld("Hi Server");
また、domain、username、および password の各プロパティを構成ファイルで設定できます。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp"
secure="true"
tokenImpersonationLevel="impersonation"
username="SomeRemotingUser"
password="Password123"
/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
メモ : |
---|
コードまたは構成で、ユーザー名およびパスワードをハードコーディングすることはお勧めできません。ここでは、例を示すことだけを目的としてハードコーディングしています。資格情報を取得するには、ユーザーに入力を求めるのが最も良い方法です。 |
既定では、TCP チャネルは NTLM を使用して呼び出し元を認証します。Kerberos の使用をチャンネルに強制するには、次の構成ファイルに示すように、サービスを実行しているアカウントに servicePrincipalName プロパティを設定します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"
servicePrincipalName="MyDomain\MyUserAccount"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
メモ : |
---|
Kerberos には Active Directory サーバーへのアクセスが必要です。コードを実行しているコンピュータが Active Directory ドメインのメンバでない場合は、代わりに NTLM (既定) を使用してください。 |
関連項目
概念
暗号化およびメッセージの整合性
HTTP チャネルでの認証
IPC チャネルでの認証
Copyright © 2007 by Microsoft Corporation.All rights reserved.