このサービス ID サンプルでは、サービスの ID を設定する方法を示します。 デザイン時に、クライアントはサービスのメタデータを使用して ID を取得し、実行時にクライアントがサービスの ID を認証できます。 サービス ID の概念は、クライアントが操作を呼び出す前にサービスを認証できるようにすることです。これにより、認証されていない呼び出しからクライアントが保護されます。 セキュリティで保護された接続では、サービスはアクセスを許可する前にクライアントの資格情報も認証しますが、これはこのサンプルの焦点ではありません。 サーバー認証を示す クライアント のサンプルを参照してください。
注
このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。
このサンプルは、次の機能を示しています。
サービスの異なるエンドポイントでさまざまな種類の ID を設定する方法。 ID の種類ごとに異なる機能があります。 使用する ID の種類は、エンドポイントのバインドで使用されるセキュリティ資格情報の種類によって異なります。
ID は、構成で宣言的に設定することも、コード内で命令型に設定することもできます。 通常、クライアントとサービスの両方で、構成を使用して ID を設定する必要があります。
クライアントでカスタム ID を設定する方法。 カスタム ID は通常、既存の種類の ID をカスタマイズしたものです。これにより、クライアントはサービスの資格情報で提供される他の要求情報を調べて、サービスを呼び出す前に承認の決定を行うことができます。
注
このサンプルでは、identity.com という特定の証明書の ID と、この証明書に含まれる RSA キーを確認します。 クライアントの構成で証明書と RSA ID の種類を使用する場合、これらの値を取得する簡単な方法は、これらの値がシリアル化されているサービスの WSDL を検査することです。
次のサンプル コードは、WSHttpBinding を使用して、証明書のドメイン ネーム サーバー (DNS) を使用してサービス エンドポイントの ID を構成する方法を示しています。
//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;
ID は、App.config ファイルの構成でも指定できます。 次の例は、サービス エンドポイントの UPN (ユーザー プリンシパル名) ID を設定する方法を示しています。
<endpoint address="upnidentity"
behaviorConfiguration=""
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_Windows"
name="WSHttpBinding_ICalculator_Windows"
contract="Microsoft.ServiceModel.Samples.ICalculator">
<!-- Set the UPN identity for this endpoint -->
<identity>
<userPrincipalName value="host\myservice.com" />
</identity >
</endpoint>
EndpointIdentityクラスとIdentityVerifier クラスから派生することで、クライアントでカスタム ID を設定できます。 概念的には、 IdentityVerifier クラスは、サービスの AuthorizationManager
クラスと同等のクライアントと見なすことができます。 次のコード例は、サーバーの証明書のサブジェクト名に一致する組織名を格納する OrgEndpointIdentity
の実装を示しています。 組織名の承認チェックは、CheckAccess
クラスの CustomIdentityVerifier
メソッドで行われます。
// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
private string orgClaim;
public OrgEndpointIdentity(string orgName)
{
orgClaim = orgName;
}
public string OrganizationClaim
{
get { return orgClaim; }
set { orgClaim = value; }
}
}
//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
{
bool returnvalue = false;
foreach (ClaimSet claimset in authContext.ClaimSets)
{
foreach (Claim claim in claimset)
{
if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
{
X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
{
Console.WriteLine("Claim Type: {0}",claim.ClaimType);
Console.WriteLine("Right: {0}", claim.Right);
Console.WriteLine("Resource: {0}",claim.Resource);
Console.WriteLine();
returnvalue = true;
}
}
}
}
return returnvalue;
}
}
このサンプルでは、言語固有の ID ソリューション フォルダーにある identity.com という名前の証明書を使用します。
サンプルを設定、ビルド、実行するには
Windows Communication Foundation サンプル のOne-Time セットアップ手順を実行していることを確認します。
ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
シングル コンピューター構成またはクロスコンピューター構成でサンプルを実行するには、「 Windows Communication Foundation サンプルの実行」の手順に従います。
同じコンピューターでサンプルを実行するには
Windows XP または Windows Vista では、MMC スナップイン ツールを使用して、Id ソリューション フォルダー内の Identity.pfx 証明書ファイルを LocalMachine/My (Personal) 証明書ストアにインポートします。 このファイルはパスワードで保護されています。 インポート中に、パスワードの入力を求められます。 パスワード ボックスに「
xyz
」と入力します。 詳細については、「 方法: MMC スナップインを使用して証明書を表示 する」トピックを参照してください。 これが完了したら、管理者特権を持つ Visual Studio の開発者コマンド プロンプトで Setup.bat を実行します。これにより、クライアントで使用するために、この証明書が CurrentUser/Trusted People ストアにコピーされます。Windows Server 2003 では、管理者特権で Visual Studio コマンド プロンプト内のサンプル インストール フォルダーから Setup.bat を実行します。 これにより、サンプルの実行に必要なすべての証明書がインストールされます。
注
Setup.bat バッチ ファイルは、Visual Studio コマンド プロンプトから実行するように設計されています。 Visual Studio コマンド プロンプト内で設定された PATH 環境変数は、Setup.bat スクリプトに必要な実行可能ファイルを含むディレクトリを指します。 サンプルが完了したら、Cleanup.bat を実行して証明書を削除してください。 他のセキュリティ サンプルでは、同じ証明書が使用されます。
\service\bin ディレクトリから Service.exe を起動します。 サービスが準備ができていることを示し、 <Enter キーを押して> サービスを終了するように求めるメッセージが表示されていることを確認します。
\client\bin ディレクトリから Client.exe を起動するか、Visual Studio で F5 キーを押してビルドして実行します。 クライアント アクティビティがクライアント コンソール アプリケーションに表示されます。
クライアントとサービスが通信できない場合は、「WCF サンプルのトラブルシューティングのヒント」を参照してください。
複数のコンピューターでサンプルを実行するには
サンプルのクライアント部分をビルドする前に、
CallServiceCustomClientIdentity
メソッドのClient.cs ファイル内のサービスのエンドポイント アドレスの値を必ず変更してください。 次に、サンプルをビルドします。サービス コンピューター上にディレクトリを作成します。
service\bin からサービス コンピューター上のディレクトリにサービス プログラム ファイルをコピーします。 また、Setup.bat ファイルと Cleanup.bat ファイルをサービス コンピューターにコピーします。
クライアント コンピューター上にクライアント バイナリ用のディレクトリを作成します。
クライアント プログラム ファイルをクライアント コンピューター上のクライアント ディレクトリにコピーします。 また、Setup.bat、Cleanup.bat、および ImportServiceCert.bat ファイルをクライアントにコピーします。
サービスで、管理者特権で開いた Visual Studio の開発者コマンド プロンプトで
setup.bat service
を実行します。setup.bat
引数を指定してservice
を実行すると、コンピューターの完全修飾ドメイン名を持つサービス証明書が作成され、サービス証明書が Service.cer という名前のファイルにエクスポートされます。Service.cer ファイルをサービス ディレクトリからクライアント コンピューター上のクライアント ディレクトリにコピーします。
クライアント コンピューター上の Client.exe.config ファイルで、サービスの新しいアドレスと一致するようにエンドポイントのアドレス値を変更します。 複数のインスタンスを変更する必要があります。
クライアントで、管理者特権で開かれた Visual Studio の開発者コマンド プロンプトで ImportServiceCert.bat を実行します。 これにより、Service.cer ファイルから CurrentUser - TrustedPeople ストアにサービス証明書がインポートされます。
サービス コンピューターで、コマンド プロンプトから Service.exe を起動します。
クライアント コンピューターで、コマンド プロンプトから Client.exe を起動します。 クライアントとサービスが通信できない場合は、「WCF サンプルのトラブルシューティングのヒント」を参照してください。
サンプルの実行後にクリーンアップするには
サンプルの実行が完了したら、samples フォルダーで Cleanup.bat を実行します。
注
このスクリプトは、コンピューター間でこのサンプルを実行するときに、クライアント上のサービス証明書を削除しません。 コンピューター間で証明書を使用する Windows Communication Foundation (WCF) サンプルを実行している場合は、CurrentUser - TrustedPeople ストアにインストールされているサービス証明書を必ずクリアしてください。 これを行うには、次のコマンドを使用します。
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
例:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.