我正在使用几种类型的wcf服务,
其中一个签了。
通常我从:
现在,当它获得签名服务时,主要身份就成了X509证书。
Windows身份是anonymos或类似的东西..
发送证书和常规身份的正确方法是什么 或者,如何获取用户名..?
感谢大家。
答案 0 :(得分:2)
这意味着您的服务使用clientCredentialsType="Certificate"
的安全设置。此证书用作客户的标识。如果您要使用UserName
或Windows
身份验证,为什么要使用证书?如果您使用安全配置(传输或邮件安全性),则将始终对邮件进行签名。
可以传递证书和用户名,但它需要在代码中开发完整的自定义绑定,其中用户名将作为支持令牌传递。我不确定WCF是否支持此级别,以便从支持令牌中为您填充PrimaryIdentity
。
答案 1 :(得分:1)
如果您在AD中映射了客户端证书,则可以通过设置
来获取它system.webServer / security / authentication / clientCertificateMappingAuthentication属性为True。
这仅适用于IIS 7.x.我不知道IIS 6中的等效设置。但我假设有一些AD客户端证书映射设置。
HTH
答案 2 :(得分:1)
我在web.config中使用自定义绑定来执行X509证书和WSS用户名令牌。您不需要在代码中开发自定义绑定。它可以在配置文件中完成。您可能希望同时使用证书和用户名令牌,因为您的客户端和服务之间可能有一些东西(例如Datapower,Biztalk等)。而且你需要在中间验证客户端和东西。
这是我的自定义绑定...
<customBinding>
<binding name="MySvcBindingConfiguration">
<security authenticationMode="UserNameOverTransport" includeTimestamp="false" requireDerivedKeys="false" securityHeaderLayout="Lax" messageProtectionOrder="SignBeforeEncrypt" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
<localClientSettings maxClockSkew="00:30:00" />
<localServiceSettings maxClockSkew="00:30:00" />
<secureConversationBootstrap />
</security>
<textMessageEncoding messageVersion="Soap11">
<readerQuotas maxDepth="32" maxStringContentLength="524288" maxArrayLength="524288" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</textMessageEncoding>
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>
请参阅我对PrimaryIdentity.Name
关于ServiceSecurityContext.Current.PrimaryIdentity
的回答。您可以使用自定义AuthorizationPolicy完全自定义ServiceSecurityContext.Current.PrimaryIdentity
。
在AuthorizationPolicy的Evaluate函数中,您将在评估上下文中看到多个身份。您可以使用自己的自定义标识替换它们,然后WCF会将该标识放在var myCertIdId = identities.Find(x => x.AuthenticationType == "X509");
var myCertThumbprint = myCertIdId != null
? myCertIdId.Name.Substring(myCertIdId.Name.LastIndexOf(';') + 2)
: "";
var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var certCol =
store.Certificates.Find(X509FindType.FindByThumbprint, myCertThumbprint, false);
store.Close();
var myCert = certCol[0];
中。当您将它放回到evaluateContext中时,请确保列表中只有一个标识。
此外,如果您在IIS网站或VDir中需要SSL和客户端证书,那么它将在evaluationContext中显示为X509Identity。
{{1}}
myCert是来自证书存储区的证书...您可能想要检查集合上的计数,如果计数为0,则抛出异常或其他内容。