一些背景:为了提供身份验证,我在客户端和服务器端(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。所以我需要在服务器端知道哪个域用户请求了服务操作。