TCP チャネルでの認証

このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。

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>
59hafwyt.note(ja-jp,VS.100).gif注 :
通信のセキュリティを保護するには、クライアント チャネルの 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>
59hafwyt.note(ja-jp,VS.100).gif注 :
偽装を実行するには、クライアント チャネルの tokenImpersonationLevel プロパティを impersonation または delegation に設定する必要があります。サーバー上ではこのプロパティは impersonate という名前ですが、クライアント上では tokenImpersonationLevelimpersonation に設定します。

59hafwyt.note(ja-jp,VS.100).gif注 :
すべてのプロセスが 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>
59hafwyt.note(ja-jp,VS.100).gif注 :
通信のセキュリティを保護するには、サーバー チャネルの 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>
59hafwyt.note(ja-jp,VS.100).gif注 :
偽装を実行するには、サーバー チャネルの impersonate プロパティを true に設定する必要があります。サーバー上ではこのプロパティは impersonate という名前ですが、クライアント上では tokenImpersonationLevelimpersonation に設定されます。

59hafwyt.note(ja-jp,VS.100).gif注 :
すべてのプロセスが Windows Vista の標準のユーザー アカウントを使用して実行されます。標準のユーザーは管理者アカウントを偽装できません。管理者アカウントを偽装する必要があるリモート処理アプリケーションがある場合、そのアプリケーションは管理者特権で実行する必要があります。

tokenImpersonationLevel は、次の表のいずれかの値に設定できます。

tokenImpersonationLevel の設定 説明

Identification

サーバーは、セキュリティ ID や特権などのクライアント情報を取得できますが、クライアントを偽装できません。

Impersonation

サーバーは、ローカル システム上にあるクライアントのセキュリティ コンテキストを偽装できます。サーバーは、リモート システムにあるクライアントを偽装できません。

Delegation

サーバーは、リモート システムにあるクライアントを偽装できます。

既定では、TCP クライアント チャネルは、クライアントの処理の実行に使用されるユーザー ID でそれ自体を認証します。次のコード例に示すように、domainusername、および 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");

また、domainusername、および 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>
59hafwyt.note(ja-jp,VS.100).gif注 :
コードまたは構成で、ユーザー名およびパスワードをハードコーディングすることはお勧めできません。ここでは、例を示すことだけを目的としてハードコーディングしています。資格情報を取得するには、ユーザーに入力を求めるのが最も良い方法です。

既定では、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>
59hafwyt.note(ja-jp,VS.100).gif注 :
Kerberos には Active Directory サーバーへのアクセスが必要です。コードを実行しているコンピューターが Active Directory ドメインのメンバーでない場合は、代わりに NTLM (既定) を使用してください。

参照

概念

暗号化およびメッセージの整合性
HTTP チャネルでの認証
IPC チャネルでの認証