我有一个托管在 IIS 中的 WCF 服务。与服务通信的客户必须拥有我们公司的客户证书之一。该服务使用证书来识别客户端并处理访问。
现在,我还希望客户端使用用户名和密码进行身份验证,以及具有双重身份验证的额外安全层。用户凭据将与证书一起用于识别客户端以处理访问。
我希望我唯一需要做的就是从客户端发送用户凭据,但我不知道如何在服务中获取它们。
仅使用证书的工作代码:
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";
如何在服务中获取此用户名和密码?
当前服务配置为:
<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>