このトピックでは、Windows Communication Foundation (WCF) サービスが Windows ドメインのユーザー名とパスワードを使用してクライアントを認証できるようにする方法を示します。 自己ホスト型 WCF サービスが稼働していることを前提としています。 基本的な自己ホスト型 WCF サービスを作成する例については、「入門チュートリアル」を参照してください。 このトピックでは、サービスがコードで構成されているものとします。 構成ファイルを使用して同様のサービスを構成する例については、「メッセージ セキュリティ ユーザー名」を参照してください。
Windows ドメイン ユーザー名とパスワードを使用してクライアントを認証するようにサービスを構成するには、WSHttpBinding を使用し、その Security.Mode
プロパティを Message
に設定します。 また、ユーザー名とパスワードをクライアントからサービスに送信するときに X.509 証明書を指定する必要があります。この証明書は、ユーザー名とパスワードの暗号化に使用されます。
クライアント側では、ユーザーにユーザー名とパスワードの入力を求め、WCF クライアント プロキシでユーザーの資格情報を指定する必要があります。
Windows ドメイン ユーザー名とパスワードを使用して認証するように WCF サービスを構成するには
次のコードに示すように、WSHttpBinding のインスタンスを作成し、バインディングのセキュリティ モードを WSHttpSecurity.Message に設定した後、バインディングの
ClientCredentialType
を MessageCredentialType.UserName に設定し、構成されたバインディングを使用するサービス エンドポイントをサービス ホストに追加します。// ... var userNameBinding = new WSHttpBinding(); userNameBinding.Security.Mode = SecurityMode.Message; userNameBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; svcHost.AddServiceEndpoint(typeof(IService1), userNameBinding, ""); // ...
ネットワーク経由で送信されるユーザー名とパスワードの情報を暗号化するために使用するサーバー証明書を指定します。 次のコードは、上記のコードの直後に追加します。 次の例では、「メッセージ セキュリティ ユーザー名」のサンプルの setup.bat ファイルによって作成された証明書を使用します。
// ... svcHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "localhost"); // ...
独自の証明書を使用する場合は、その証明書を参照するようにコードを変更します。 証明書の作成と使用の詳細については、「証明書の使用」を参照してください。 証明書がローカル コンピューターの信頼されたユーザー証明書ストア内に存在することを確認します。 これを行うには、mmc.exe を実行し、 [ファイル] 、 [スナップインの追加と削除] メニュー項目を選択します。 [スナップインの追加と削除] ダイアログで、 [証明書スナップイン] を選択して、 [追加] をクリックします。 [証明書スナップイン] ダイアログで、 [コンピューター アカウント] を選択します。 既定では、「メッセージ セキュリティ ユーザー名」のサンプルから生成された証明書は個人/証明書フォルダーに配置されます。 これは、MMC ウィンドウの [発行先] 列に "localhost" として表示されます。 [信頼されたユーザー] フォルダーに証明書をドラッグ アンド ドロップします。 これにより、WCF は、認証の実行時に、証明書を信頼された証明書として処理することができます。
ユーザー名とパスワードを渡すサービスを呼び出すには
クライアント アプリケーションは、ユーザー名とパスワードの入力をユーザーに求める必要があります。 次のコードでは、ユーザー名とパスワードの入力をユーザーに求めます。
警告
このコードは、入力中のパスワードが表示されるため、運用環境では使用しないでください。
public static void GetPassword(out string username, out string password) { Console.WriteLine("Provide a valid machine or domain account. [domain\\user]"); Console.WriteLine(" Enter username:"); username = Console.ReadLine(); Console.WriteLine(" Enter password:"); password = Console.ReadLine(); }
次のコードに示すように、クライアントの資格情報を指定して、クライアント プロキシのインスタンスを作成します。
string username; string password; // Instantiate the proxy. var proxy = new Service1Client(); // Prompt the user for username & password. GetPassword(out username, out password); // Set the user's credentials on the proxy. proxy.ClientCredentials.UserName.UserName = username; proxy.ClientCredentials.UserName.Password = password; // Treat the test certificate as trusted. proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust; // Call the service operation using the proxy