認証のためのサービスの ID をオーバーライドする

クライアント資格情報の種類を選択すると、サービス メタデータで公開される ID の種類が指定されるため、通常、サービスで ID を設定する必要はありません。 たとえば、次の構成コードでは、<wsHttpBinding> 要素を使用し、clientCredentialType 属性を Windows に設定しています。

次の Web サービス記述言語 (WSDL) コードは、定義済みのエンドポイントの ID を示しています。 この例では、サービスは、特定のユーザー アカウント (username@contoso.com) で自己ホスト型サービスとして実行されているため、ユーザー プリンシパル名 (UPN) ID にこのアカウント名が含まれています。 UPN は、Windows ドメインではユーザー サインイン名とも呼ばれます。

ID の設定を示すサンプル アプリケーションについては、「サービス ID のサンプル」を参照してください。 サービス ID の詳細については、「サービス ID と認証」を参照してください。

Kerberos 認証と ID

既定では、サービスが Windows 資格情報を使用するように構成されている場合、<userPrincipalName> または <servicePrincipalName> 要素を含む <identity> 要素が WSDL に生成されます。 サービスが LocalSystemLocalService、または NetworkService のいずれかのアカウントで実行されている場合、これらのアカウントはコンピューターのサービス プリンシパル名 (SPN) データにアクセスできるため、host/<hostname> という形式のサービス プリンシパル名 (SPN) が既定で生成されます。 サービスが別のアカウントで実行されている場合、Windows Communication Foundation (WCF) は、<username>@<domainName> という形式の UPN を生成します。 これらが生成されるのは、Kerberos 認証では、サービスを認証するために UPN または SPN をクライアントに提供する必要があるからです。

Setspn ツールを使用して、他の SPN をドメイン内のサービスのアカウントに登録することもできます。 登録した SPN は、そのサービスの ID として使用できます。 ツールの詳細については、「Setspn の概要」を参照してください。

Note

ネゴシエーションを行わずに 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 の詳細については、「Windows に対する Kerberos のテクニカル サポート」を参照してください。

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> 要素を使用するか、コードで ID を設定することにより、既定のサービス ID の値を変更するか、ID の種類を変更することができます。 値 contoso.com を使用してドメイン ネーム システム (DNS) ID を設定する構成コードを次に示します。

プログラムによって ID を設定する

ID は、WCF によって自動的に決定されるため、サービスで ID を明示的に指定する必要はありません。 ただし、WCF では、必要に応じてエンドポイントの ID を指定できます。 特定の DNS ID を持つ新しいサービス エンドポイントを追加するコードを次に示します。

ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd

関連項目