HTTP チャネルでの認証

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

HttpChannel チャネルでリモートの呼び出しを認証するには、インターネット インフォメーション サービス (IIS: Internet Information Services) でリモート オブジェクトをホストする必要があります。

サーバーの構成

サーバーのすべての認証構成は、IIS を通じて行われます。HttpChannel の認証に関連するサーバー構成設定はありません。IIS および認証の構成の詳細については、「IIS Authentication」を参照してください。

クライアントの構成

IIS でホストされ、認証用に構成されたリモート オブジェクトを呼び出す場合、クライアントは資格情報を指定する必要があります。クライアント アプリケーションの実行に使用している資格情報を自動で送信するには、useDefaultCredentials プロパティを true に設定します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application>
      <channels>
        <channel ref="http" useDefaultCredentials="true"/>
      </channels>
      <client>
        <wellknown 
           url="http://MyServer/IISSec/MyRemoteObj.rem"
           type="Shared.MyRemoteObj, Shared"/>
      </client>
    </application>
  </system.runtime.remoting>
</configuration>

別の資格情報のセットを指定する場合は、次のコードに示すようにプログラムで指定します。

MyRemoteObj obj = new MyRemoteObj();
// Get the current set of channel sink properties
IDictionary props = ChannelServices.GetChannelSinkProperties(obj);
// Set domain, username, and password properties
props["domain"] = "SomeDomain";
props["username"] = "SomeUser";
props["password"] = "SomePassword123";
Console.WriteLine(obj.SayHello());

また、credentials プロパティをプログラミングによって設定して、ICredentials インターフェイスを実装するクラスを指定できます。最初に、ICredentials インターフェイスを実装するクラスを作成します。

namespace MyCredentialsLib
{
    public class MyCredentials : ICredentials
    {
        public NetworkCredential GetCredential(Uri uri, string authType)
        {
            Console.WriteLine("MyCredentials.GetCredential() called");
            NetworkCredential newCred = new NetworkCredential("SomeRemotingUser", "SomePassword");
            return newCred;
        }
    }
} 

次に、クライアントで、ICredentials を実装するクラスのインスタンスを作成し、次のコードに示すように、credentials プロパティにそのインスタンスを設定します。

RemotingConfiguration.Configure("client.exe.config", false);
MyRemoteObj obj = new MyRemoteObj();
IDictionary props = ChannelServices.GetChannelSinkProperties(obj);
MyCredentials credentials = new MyCredentials();
props["credentials"] = credentials;
Console.WriteLine(obj.SayHello()); 
36tfwzb0.note(ja-jp,VS.100).gif注 :
アプリケーションに資格情報をハードコーディングするのは、どのような場合でも得策ではありません。ここでは、例を示すことだけを目的としてハードコーディングしています。

useAuthenticatedConnectionSharing プロパティは、サーバー チャネルが、受信した各呼び出しを認証するのではなく、認証済みの接続を再利用するかどうかを示します。このプロパティは、useDefaultCredentials プロパティが true に設定されている場合は、既定で true に設定されます。このプロパティは、構成ファイル (<channel> 要素内) で設定することも、プログラムによって (username プロパティと password プロパティを前述のサンプル コードで設定した方法と同じ方法で) 設定することもできます。

unsafeAuthenticatedConnectionSharing プロパティは、クライアントが独自の資格情報と接続グループ名を指定し、サーバーがその情報を使用して認証済みの接続グループを作成するかどうかを示します。このプロパティが true に設定されている場合、connectionGroupName プロパティを単一の認証済みユーザーに設定する必要があります。このプロパティは、useAuthenticatedConnectionSharing プロパティが true に設定されている場合は無視されます。

参照

概念

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