1

一些背景:为了提供身份验证,我在客户端和服务器端(WCF)使用证书并为所有客户端使用一个证书(从应用程序目录手动加载它 - 不是最安全的方式,但它不需要管理证书存储和使安装更加困难):

        AddressHeader hostHdr = AddressHeader.CreateAddressHeader(ServiceFactory.CLIENT_HOST_HEADER, ServiceFactory.NAMESPACE, hostName);
        builder.Headers.Add(hostHdr);
        builder.Identity = new X509CertificateEndpointIdentity(GetServiceCertificate(name));
        

        _factory = new ChannelFactory<T>(name, builder.ToEndpointAddress());
        _factory.Credentials.ClientCertificate.Certificate = GetClientCertificate(name);
        X509ServiceCertificateAuthentication auth = _factory.Credentials.ServiceCertificate.Authentication;

        auth.CertificateValidationMode =X509CertificateValidationMode.Custom;
        auth.CustomCertificateValidator = new CustomCertificateValidator(new[] {GetServiceCertificate(name)});

这是客户端,服务器端主机设置如下所示:

private void CertificateSetup(ServiceHost host)
    {
        if (ServiceCertificate != null)
            host.Credentials.ServiceCertificate.Certificate = ServiceCertificate;

        X509ClientCertificateAuthentication authentication =
                        host.Credentials.ClientCertificate.Authentication;
        
        authentication.CertificateValidationMode =
            X509CertificateValidationMode.Custom;

        authentication.CustomCertificateValidator =
            new CustomCertificateValidator(new [] {ClientCertificate});
    }

这工作正常并允许签署消息,但就安全模式设置如下:

      <security mode="Message">            
        <message clientCredentialType="Certificate" />
      </security>

但是我需要

string name = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;

以某种方式在 ServiceSecurityContext 中获取 WindowsIdentity。混合(传输和消息)安全模式没有帮助,因为我不知道为什么,但即使我在配置中为传输部分模式基础设施设置 Windows clientCredentials 也会尝试建立 SSL 连接。

有任何想法吗 ????


证书用于消息签名,即证明另一方是真正的客户端或服务(中间人)。但正在开发的系统中的授权部分依赖于 ServiceSecurityContect 中的 WindowsIdentity。我想要的只是在 sec.context 中包含 WindowsIdentity,同时 PrimaryIdentity 是 X509CertIdentity。所以我需要在服务器端知道哪个域用户请求了服务操作。

4

2 回答 2

1

试试这个链接重新:模拟:

http://msdn.microsoft.com/en-us/library/ms730088.aspx

关于“将客户端证书映射到 Windows 帐户”的部分,似乎是您所追求的。

在客户端配置:

authentication mapClientCertificateToWindowsAccount="true" 

客户端代码:

' 创建一个将证书设置为客户端凭据类型的绑定。

Dim b As WSHttpBinding = New WSHttpBinding()

b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate

' 创建将证书映射到 Windows 帐户的服务主机。

Dim httpUri As Uri = New Uri("http://localhost/Calculator")

Dim sh As ServiceHost = New ServiceHost(GetType(HelloService), httpUri)

sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = True

希望有帮助

于 2009-01-21T11:52:27.853 回答
0

如果您在每一端都使用带有证书的消息安全性来保护它,我不太确定您为什么需要 Windows 身份?这背后的原因是什么?

也许这个链接会有用——第 6 节和第 7 节有证书身份验证的配置设置的详细信息,其工作方式类似于 SSL:

http://www.codeproject.com/KB/WCF/wcf_certificates.aspx

于 2009-01-21T10:26:48.853 回答