wsHttpBinding がある CardSpace の使用
このサンプルでは、CardSpace を Web サービスで使用するよう wsHttpBinding を構成する方法を示します。
![]() |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
このサンプルでは、ISecureCalculator
コントラクトを定義して、CardSpace で表される個人 ID クレームの使用方法を示します。CalculatorService
では、ISecureCalculator
という名前のサービス コントラクトが定義されて実装されます。次のサンプル コードを参照してください。
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ISecureCalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
[OperationContract]
string GetIdentity();
}
サービスは、CardSpace によって提供される SAML トークンを要求するように構成されます。
GetIdentity
操作のサービス実装により、Private-Personal-Identifier (PPID) クレームが抽出され、応答で返されます。PrivatePersonalIdentifier
は一意の定数で、トークンの発行者によって生成された組み込みのプライバシー機能があります。サービスでは、この識別子を、発行者の署名のような他の情報や他のクレームと共に、アカウントの検索と認証に使用できます。同じカードが選択されている場合でも、PPID はサービスごとに異なります。
const string ppidClaimType =
"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/ privatepersonalidentifier";
public string GetIdentity()
{
string identity=String.Empty;
AuthorizationContext ctx = OperationContext.Current.ServiceSecurityContext.AuthorizationContext;
foreach (ClaimSet claimSet in ctx.ClaimSets)
{
foreach (Claim claim in claimSet.FindClaims(ppidClaimType, null))
{
identity += claim.Resource as string;
}
}
return identity;
}
サービスは単一のエンドポイントを公開します。これは、構成ファイル (Web.config) に定義されており、要求元からの CardSpace を必要とします。次のサンプル構成を参照してください。
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="ServiceCredentials">
<!-- This endpoint is exposed at the base address provided by host: https://localhost/servicemodelsamples/service.svc -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="requireInfoCard"
contract="Microsoft.ServiceModel.Samples.ISecureCalculator" >
<identity>
<certificateReference
findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
x509FindType="FindByThumbprint"
storeLocation="LocalMachine"
storeName="My" />
</identity>
</endpoint>
<!-- The mex endpoint is exposed at https://localhost/servicemodelsamples/service.svc/mex. -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="requireInfoCard">
<security mode="Message">
<message clientCredentialType="IssuedToken" />
</security>
</binding>
</wsHttpBinding>
</bindings>
また、サービスはサービス証明書を指定するよう動作を構成します。クライアントはこのサービス証明書を使用して、サービスを認証し、サービス宛てメッセージをセキュリティ保護します。
<behaviors>
<serviceBehaviors>
<behavior name="ServiceCredentials">
<serviceMetadata httpGetEnabled="True"/>
<serviceCredentials>
<serviceCertificate
findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
x509FindType="FindByThumbprint"
storeLocation="LocalMachine"
storeName="My" />
<issuedTokenAuthentication allowUntrustedRsaIssuers="true" />
</serviceCredentials>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
さらにクライアントも、CardSpace によって提供される SAML トークンを要求するよう構成されます。これにより、サービスへの最初の要求時に CardSpace のユーザー インターフェイスが呼び出されます。ユーザーは、サービスに提示する適切な情報カードを選択できます。情報カードを選択すると、ID を表す SAML トークンを使用して要求がセキュリティで保護されます。ISecureCalculator
コントラクトでの GetIdentity
操作により、SAML トークンで提供された PrivatePersonalIdentifer クレームが抽出され、呼び出し元に返されます。
クライアントは、サービスとの通信に、Service Metadata Utility Tool (Svcutil.exe) によって生成された、型指定のある WCF クライアント クラスを使用します。型指定のある Windows Communication Foundation (WCF) クライアント クラスは、ファイル GeneratedProxy.cs に含まれています。
クライアントの構成は、Service Metadata Utility Tool (Svcutil.exe) を使用して生成することもできます。Service Metadata Utility Tool (Svcutil.exe) は、サービスが公開したメタデータに基づいてクライアント エンドポイント構成を作成します。このサンプルでは、サービス構成から開始することにより、クライアント構成を手動で作成します。
クライアントでは、clientCredentialType を IssuedToken に設定し、CardSpace でサービスを認証できるように certificateReference を構成する必要があります。次のサンプル構成を参照してください。
<client>
<endpoint
address="https://localhost/ServiceModelSamples/service.svc/"
bindingConfiguration="requireInfoCard"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ISecureCalculator"
behaviorConfiguration="ClientCredentials">
<identity>
<certificateReference
findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
x509FindType="FindByThumbprint"
storeLocation="CurrentUser"
storeName="TrustedPeople" />
</identity>
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="requireInfoCard">
<security mode="Message">
<message clientCredentialType="IssuedToken" />
</security>
</binding>
</wsHttpBinding>
</bindings>
クライアントは、エンドポイントでサービス証明書を提供するだけでなく、信頼しているサービスの証明書を指定する必要があります。そのためには、証明書ストアにあってクライアントが信頼している証明書を参照する動作を定義します。
<behaviors>
<endpointBehaviors>
<behavior name="ClientCredentials"
includeExceptionDetailInFaults="true">
<clientCredentials>
<serviceCertificate>
<defaultCertificate
findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
x509FindType="FindByThumbprint"
storeLocation="CurrentUser"
storeName="TrustedPeople" />
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certificate authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication
revocationMode="NoCheck"
certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
クライアントを実行して Enter キーを押すと、クライアントで GetIdentity
操作が呼び出され、CardSpace のユーザー インターフェイスが起動します。
CardSpace から既存のカードを選択するか、新しいカードを作成します。
[Send] をクリックしてカードを送信します。
CardSpace 内のクレームが、CardSpace の SAML トークン シリアル化としてサービスに送信されます。サービスの GetIdentity
操作によって、SAML トークンから抽出されたクレームが応答として返されます。次に、クライアントはサービスの電卓操作を呼び出します。応答はコンソール ウィンドウに表示されます。
Identity - (Private Personal ID) = LGGjXshcVQE1kFMnxccopDBGvYu6gVs2Aexx+4bMlbk=
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
サンプルを実行するのが同じコンピュータか別のコンピュータかに応じて、次の手順に従います。具体的には、サンプルのインストール ディレクトリの下にある言語固有のディレクトリで、Setup.bat を実行します。
メモ :
Setup.bat バッチ ファイルは、Windows SDK コマンド プロンプトから実行します。MSSDK 環境変数が SDK のインストール ディレクトリを指している必要があります。この環境変数は、Windows SDK コマンド プロンプトで自動設定されます。Windows Vista の場合、IIS 6.0 互換性サポートが IIS 7.0 と共にインストールされていることを確認してください。
ソリューションの C# 版または Visual Basic 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
このサンプルの実行後は、サンプルのインストール ディレクトリの下にある言語固有のディレクトリで、Cleanup.bat を実行します。
サンプルを同じコンピュータで実行するには
Simple\SampleResources\Fabrikam-Contoso.pfx 証明書を LocalMachine/My (Personal) 証明書ストアにインポートします。この証明書のパスワードは xyz です。
メモ :
Fabrikam-Contoso-Public.cer ファイルをインポートしないでください。インポートするのは Fabrikam-Contoso.pfx ファイルです。
Simple ディレクトリの下にある言語固有のディレクトリで、Setup.bat を実行します。これにより、クライアントが使用する Fabrikam-Contoso-Public.cer 証明書が CurrentUser/TrustedPeople 証明書ストアにインストールされます。また、IIS ホストの Web サービスに対し、前の手順でインストールした Fabrikam 証明書の秘密キーの読み取りを許可します。
メモ :
Windows Vista では、手動で証明書をインポートしてから Setup.bat を実行してください。このようにしなければ、"キー セットがありません" というエラーが発生します。
メモ :
CardSpace サンプルの使用が終了したら、Cleanup.bat を実行して必ず証明書を削除してください。CardSpace の他のサンプルでも同じ証明書を使用します。Setup.bat バッチ ファイルは、Windows SDK コマンド プロンプトから実行します。実行するには、MSSDK 環境変数が SDK のインストール ディレクトリを指している必要があります。この環境変数は、Windows SDK コマンド プロンプトで自動設定されます。
Simple フォルダの言語固有のフォルダにある、Visual Studio のサンプル ソリューション ファイル CardSpace.sln をビルドします。
サービスが実行中であることを確認するには、Web ブラウザでアドレス https://localhost/servicemodelsamples/service.svc を開きます。ブラウザに、サービスの概要が表示されます。
Simple\<CS,VB>\client\bin で client.exe を起動します。
クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。
サンプルを別のコンピュータで実行するには
Web サービスをホストしているサーバーの場合 :
サンプルのソース ディレクトリがサーバー上に存在しない場合は、TechnologySamples\Basic\Binding\WS\CardSpace\Simple ディレクトリをサーバーにコピーします。
Simple\SampleResources\Fabrikam-Contoso.pfx 証明書を LocalMachine/My (Personal) 証明書ストアにインポートします。この証明書のパスワードは xyz です。
メモ :
Fabrikam-Contoso-Public.cer ファイルをインポートしないでください。インポートするのは Fabrikam-Contoso.pfx ファイルです。
Simple ディレクトリの下にある言語固有のディレクトリで、Setup.bat を実行します。
メモ :
Setup.bat は、クライアントが必要とする証明書を CurrentUser/TrustedPeople にインストールし、ロゴ イメージを ServiceModelSamples 仮想ディレクトリにコピーします。これを回避するには、Setup.bat を実行する代わりにサービスの証明書をインストールします。
Simple\<CS,VB>\service\service.csproj プロジェクトをビルドします。
サービスが実行中であることを確認するには、Web ブラウザでアドレス https://localhost/servicemodelsamples/service.svc を開きます。ブラウザに、サービスの概要が表示されます。
メモ :
サーバーでサンプルの実行が終わったら、Simple フォルダの下にある言語固有のディレクトリで、Cleanup.bat を実行します。
クライアントをホストしているコンピュータの場合 :
サンプルのソース ディレクトリがコンピュータ上に存在しない場合は、TechnologySamples\Basic\Binding\WS\CardSpace\Simple をコンピュータにコピーします。
Simple ディレクトリの下にある言語固有のディレクトリで、Setup.bat を実行します。Fabrikam-Contoso.pfx に含まれているサービス証明書はインストールする必要はありません。
Simple\<CS,VB>\client\client.csproj プロジェクトをビルドします。
ファイル client\bin\client.exe.config で、
<endpoint address="
https://localhost/ServiceModelSamples/service.svc" .../>
のアドレスを Web サービスの新しいアドレスに変更します。
client\bin\client.exe を実行します。
メモ :
サンプルの使用が終わったら、Cleanup.bat を実行します。
クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。
サンプルの実行後にクリーンアップするには
- サンプルのインストール ディレクトリの下にある言語固有のディレクトリで、Cleanup.bat を実行します。
Copyright © 2007 by Microsoft Corporation.All rights reserved.