サービス ID サンプル
このサービス ID サンプルでは、サービスの ID を設定する方法を示します。 クライアントは、デザイン時にサービスのメタデータを使用して ID を取得し、実行時にそのサービス ID を認証することができます。 サービス ID の概念は、クライアントがサービス操作を呼び出す前にそのサービスを認証できるようにし、それによって認証されていない呼び出しからクライアントを保護することにあります。 セキュリティ保護されている接続では、サービスがクライアントの資格情報を認証した後にクライアントのアクセスを許可できますが、このサンプルではこのことを主眼とはしていません。 サーバー認証を示すサンプルについては、「クライアント」を参照してください。
Note
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。
このサンプルでは次の機能を示します。
サービスのさまざまなエンドポイントにある、さまざまな種類の ID を設定する方法。 ID の種類によって機能も異なります。 使用する ID の種類は、エンドポイントのバインディングで使用するセキュリティ資格情報の種類によって決まります。
ID は、構成内での宣言によって設定できるほか、コードで強制的に設定することもできます。 通常、クライアントとサービスのどちらの場合も、ID の設定には構成を使用します。
クライアントのカスタム ID を設定する方法。 カスタム ID は通常、既存の種類の ID をカスタマイズしたもので、クライアントがサービスの資格情報で提供される他のクレーム情報を調べ、サービスを呼び出す前に承認決定を行うようにします。
Note
このサンプルでは、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>
カスタム ID は、EndpointIdentity クラスと IdentityVerifier クラスから派生させることによって、クライアント上で設定できます。 概念上、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;
}
}
このサンプルでは identity.com という証明書を使用します。この証明書は、言語固有の ID ソリューション フォルダーにあります。
サンプルをセットアップ、ビルド、および実行するには
Windows Communication Foundation サンプルの 1 回限りのセットアップの手順を実行したことを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「 Building the Windows Communication Foundation Samples」の手順に従います。
単一または複数コンピューター構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。
サンプルを同じコンピューターで実行するには
Windows XP または Windows Vista では、MMC スナップイン ツールを使用して、ID ソリューション フォルダーの Identity.pfx 証明書ファイルを LocalMachine/My (Personal) 証明書ストアにインポートします。 このファイルは、パスワードで保護されています。 インポート中に、パスワードの入力を求められます。 [パスワード] ボックスに「
xyz
」と入力します。 詳細については、「方法: MMC スナップインを使用して証明書を参照する」トピックを参照してください。 これが完了したら、管理者特権を使用して Visual Studio の開発者コマンド プロンプトで Setup.bat を実行します。この証明書が、クライアントで使用するために CurrentUser-TrustedPeople ストアにコピーされます。Windows Server 2003 では、管理者特権を使用して、Visual Studio コマンド プロンプト内でサンプルのインストール フォルダーから Setup.bat を実行します。 これにより、サンプルの実行に必要なすべての証明書がインストールされます。
Note
Setup.bat バッチ ファイルは、Visual Studio コマンド プロンプトから実行します。 Visual Studio コマンド プロンプト内で設定された PATH 環境変数は、Setup.bat スクリプトで必要な実行可能ファイルが格納されているディレクトリを指しています。 サンプルの実行後は、Cleanup.bat を実行して証明書を削除してください。 他のセキュリティ サンプルでも同じ証明書を使用します。
Service.exe を \service\bin ディレクトリで起動します。 サービスの準備が整っていることが示され、サービスを終了するには <Enter> キーを押すように求めるメッセージが表示されていることを確認します。
Client.exe を \client\bin ディレクトリで起動するか、または 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 サンプルのトラブルシューティングのヒントに関するページをご覧ください。
サンプルの実行後にクリーンアップするには
サンプルの実行が終わったら、サンプル フォルダーにある Cleanup.bat を実行します。
Note
このサンプルを複数のコンピューターで実行している場合、このスクリプトはサービス証明書をクライアントから削除しません。 複数のコンピューターで証明書を使用する 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
となります。