客户端证书接管PrimaryIdentity

时间:2011-06-05 14:39:45

标签: c# wcf certificate

我正在使用几种类型的wcf服务,
其中一个签了。
通常我从:

获取客户端用户名

ServiceSecurityContext.PrimaryIdentity.Name

现在,当它获得签名服务时,主要身份就成了X509证书。
Windows身份是anonymos或类似的东西..

发送证书和常规身份的正确方法是什么 或者,如何获取用户名..?

感谢大家。

3 个答案:

答案 0 :(得分:2)

这意味着您的服务使用clientCredentialsType="Certificate"的安全设置。此证书用作客户的标识。如果您要使用UserNameWindows身份验证,为什么要使用证书?如果您使用安全配置(传输或邮件安全性),则将始终对邮件进行签名。

可以传递证书和用户名,但它需要在代码中开发完整的自定义绑定,其中用户名将作为支持令牌传递。我不确定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,则抛出异常或其他内容。