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());
注 : |
---|
アプリケーションに資格情報をハードコーディングするのは、どのような場合でも得策ではありません。ここでは、例を示すことだけを目的としてハードコーディングしています。 |
useAuthenticatedConnectionSharing プロパティは、サーバー チャネルが、受信した各呼び出しを認証するのではなく、認証済みの接続を再利用するかどうかを示します。このプロパティは、useDefaultCredentials プロパティが true に設定されている場合は、既定で true に設定されます。このプロパティは、構成ファイル (<channel> 要素内) で設定することも、プログラムによって (username プロパティと password プロパティを前述のサンプル コードで設定した方法と同じ方法で) 設定することもできます。
unsafeAuthenticatedConnectionSharing プロパティは、クライアントが独自の資格情報と接続グループ名を指定し、サーバーがその情報を使用して認証済みの接続グループを作成するかどうかを示します。このプロパティが true に設定されている場合、connectionGroupName プロパティを単一の認証済みユーザーに設定する必要があります。このプロパティは、useAuthenticatedConnectionSharing プロパティが true に設定されている場合は無視されます。