IIS でホストされている WCF サービスがあります。サービスと通信するクライアントは、当社のクライアント証明書のいずれかを持っている必要があります。サービスは、証明書を使用してクライアントを識別し、アクセスを処理します。
ここで、クライアントがユーザー名とパスワードを使用して認証することも必要です。また、一種の 2 要素認証を使用した追加のセキュリティ レイヤーも必要です。ユーザー資格情報は、アクセスを処理するクライアントを識別するために証明書と共に使用されます。
クライアントからユーザー資格情報を送信することだけが必要だと思っていましたが、サービスで資格情報を取得する方法がわかりません。
証明書のみを使用した作業コード:
var x509ClaimSet = OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets.FirstOrDefault() as X509CertificateClaimSet;
if (x509ClaimSet == null || x509ClaimSet.X509Certificate == null)
throw AccessDeniedException();
// throws AccessDeniedException if no client can be found
var clientId = GetClientId(x509ClaimSet.X509Certificate);
今、次を使用してクライアントからユーザー資格情報を送信しようとしています:
var client = new ServiceClient();
client.ClientCredentials.UserName.UserName = "Foo";
client.ClientCredentials.UserName.Password = "Bar";
サービスでこの UserName と Password を取得するにはどうすればよいですか?
現在のサービス構成は次のとおりです。
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="ChainTrust" />
</clientCertificate>
<serviceCertificate findValue="64343ee2c8338518e78ba698f3936dc92c90db57" x509FindType="FindByThumbprint" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="DefaultBinding" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="Service" behaviorConfiguration="DefaultBehavior">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="DefaultBinding" contract="IService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>