Некоторый фон:
для обеспечения аутентификации я использую сертификаты на стороне клиента и сервера (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.
Поэтому мне нужно знать на стороне сервера, какой пользователь домена запрашивал работу службы.