Вопрос

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

Это было полезно?

Решение

Попробуйте эту ссылку re: Олицетворение:

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

Надеюсь, это поможет

Другие советы

Если вы используете защиту сообщений с сертификатами на каждом конце, обеспечивающими ее защиту, я не совсем уверен, зачем вам нужна идентификация Windows? В чем причина этого?

Может быть, эта ссылка будет полезна - разделы 6 & amp; 7 содержат подробную информацию о настройках конфигурации для аутентификации сертификата, которая работает аналогично SSL:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top