認証のためのサービスの ID のオーバーライド
クライアント資格情報の種類を選択すると、サービス メタデータで公開される ID の種類が指定されるため、通常、サービスで ID を設定する必要はありません。たとえば、次の構成コードでは、<wsHttpBinding>要素を使用し、clientCredentialType 属性を Windows に設定しています。
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_Windows">
<security mode="Message">
<message clientCredentialType="Windows"
establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!-- other configuration code not shown -->
</system.serviceModel>
</configuration>
次の Web サービス記述言語 (WSDL) コードは、定義済みのエンドポイントの ID を示しています。この例では、サービスは、特定のユーザー アカウント (username@contoso.com) で自己ホスト型サービスとして実行されているため、ユーザー プリンシパル名 (UPN) ID にこのアカウント名が含まれています。UPN は、Windows ドメインではユーザー ログオン名とも呼ばれます。
<wsdl:service name="CalculatorService">
<wsdl:port name="WSHttpBinding_ICalculator_Windows"
binding="tns:WSHttpBinding_ICalculator_Windows">
<soap12:address
location=
"https://localhost:8003/servicemodelsamples/service/upnidentity" />
<wsa10:EndpointReference>
<wsa10:Address>
https://localhost:8003/servicemodelsamples/service/upnidentity
</wsa10:Address>
<Identity
xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<Upn>username@contoso.com</Upn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
ID の設定を示すサンプル アプリケーションについては、「サービス ID サンプル」を参照してください。サービス ID 詳細情報、「サービス ID と認証」を参照してください。
Kerberos 認証と ID
Windows 資格情報を使用するようにサービスを構成した場合、既定では、<userPrincipalName> 要素または <servicePrincipalName> 要素を含む <identity> 要素が WSDL で生成されます。サービスが LocalSystem、LocalService、NetworkService のいずれかのアカウントで実行されている場合、これらのアカウントはコンピューターのサービス プリンシパル名 (SPN) データにアクセスできるため、host/<hostname> という形式の SPN が既定で生成されます。サービスが別のアカウントで実行されている場合、Windows Communication Foundation (WCF) は、<username>@<domainName> という形式の UPN を生成します。これらが生成されるのは、Kerberos 認証では、サービスを認証するために UPN または SPN をクライアントに提供する必要があるからです。
Setspn.exe ツールを使用して、他の SPN をドメイン内のサービスのアカウントに登録することもできます。登録した SPN は、そのサービスの ID として使用できます。ツールをダウンロードするには、「Windows 2000 リソース キット ツール : Setspn.exe」を参照してください。ツール詳細情報、「Setspn の概要」を参照してください。
注 : |
---|
ネゴシエーションを行わずに Windows 資格情報を使用するには、サービスのユーザー アカウントが Active Directory ドメインに登録された SPN にアクセスできる必要があります。これは、次の方法で実行できます。 |
サービスを実行するには、NetworkService アカウントまたは LocalSystem アカウントを使用します。これらのアカウントは、コンピューターが Active Directory ドメインに参加したときに確立されたコンピューターの SPN にアクセスできるため、WCF は、適切な SPN 要素を、サービスのメタデータ (WSDL) にあるサービスのエンドポイント内部に自動的に生成します。
任意の Active Directory ドメイン アカウントを使用してサービスを実行します。この場合、そのドメイン アカウント用の SPN を確立します。これには、Setspn.exe ユーティリティ ツールを使用できます。サービスのアカウント用の SPN を作成したら、SPN をそのメタデータ (WSDL) を通じてサービスのクライアントに公開するように WCF を構成します。これを行うには、アプリケーション構成ファイルまたはコードを使用して、公開されるエンドポイントのエンドポイント ID を設定します。
SPN、Kerberos プロトコル、および Active Directory 詳細情報、「Kerberos に関する技術的な補足 (Windows 用)」を参照してください。
SPN または UPN が空の文字列の場合
空の文字列の SPN または UPN を設定した場合は、使用しているセキュリティ レベルと認証モードに応じて、次のようになります。
トランスポート レベルのセキュリティを使用している場合は、NTLM (NT LanMan) 認証が選択されます。
メッセージ レベルのセキュリティを使用している場合は、認証モードによっては認証に失敗する可能性があります。
spnego モードを使用し、AllowNtlm 属性を false に設定している場合は、認証に失敗します。
spnego モードを使用し、AllowNtlm 属性を true に設定している場合、UPN が空の場合は認証に失敗しますが、SPN が空の場合は認証に成功します。
Kerberos ダイレクト ("ワンショット" とも呼ばれます) を使用している場合は、認証に失敗します。
構成での <identity> 要素の使用
前の例で示したバインディングのクライアント資格情報の種類を Certificate に変更すると、生成される WSDL には、Base64 でシリアル化された ID 値用の X.509 証明書が含まれます。コードを次に示します。これは、Windows 以外のすべてのクライアント資格情報の種類の既定値です。
<Identity xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate>
</X509Data>
</KeyInfo>
</Identity>
構成で <identity> 要素を使用するか、コードで ID を設定することにより、既定のサービス ID の値を変更することも、ID の種類を変更することもできます。値 contoso.com
を使用してドメイン ネーム システム (DNS) ID を設定する構成コードを次に示します。
プログラムによる ID の設定
ID は、WCF によって自動的に決定されるため、サービスで ID を明示的に指定する必要はありません。ただし、WCF では、必要に応じてエンドポイントの ID を指定できます。特定の DNS ID を持つ新しいサービス エンドポイントを追加するコードを次に示します。
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("https://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("https://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;