Немного предыстории: для обеспечения аутентификации я использую сертификаты на стороне клиента и сервера (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;
как-то получить WindowsIdentity в ServiceSecurityContext. Смешанный режим безопасности (транспорт и сообщение) бесполезен, потому что я не знаю почему, но даже если я установил Windows clientCredentials в конфигурации для режима транспортной части, инфраструктура пытается установить соединение SSL.
Любые идеи ????
Сертификаты используются для подписи сообщений, т. Е. доказательство того, что другая сторона является либо реальным клиентом, либо службой (человек посередине). Но авторизация в разрабатываемой системе частично зависит от WindowsIdentity в ServiceSecurityContect. Все, что я хочу, - включить WindowsIdentity в sec.context, а PrimaryIdentity - это X509CertIdentity. Поэтому мне нужно знать на стороне сервера, какой пользователь домена запросил операцию.





Если вы используете систему безопасности сообщений с сертификатами на каждом конце, защищающими ее, я не совсем уверен, зачем вам нужен идентификатор Windows? В чем причина этого?
Возможно, эта ссылка будет полезна - разделы 6 и 7 содержат подробную информацию о настройках конфигурации для аутентификации сертификата, которая работает аналогично SSL:
http://www.codeproject.com/KB/WCF/wcf_certificates.aspx
Поэтому мне нужно знать на стороне сервера, какой пользователь домена запросил операцию.
Попробуйте эту ссылку re: Impersonation:
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
надеюсь, это поможет
Рад помочь, WCF временами может быть болезненным!
Сертификаты используются для подписи сообщений, т. Е. доказывая, что другая сторона является реальным клиентом / службой, но авторизация частично зависит от WindowsIdentity в ServiceSecurityContect. Все, что я хочу, - включить WindowsIdentity в sec.context, а PrimaryIdentity - это X509CertIdentity.