Проблема безопасности WCF - PullRequest
1 голос
/ 21 января 2009

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

Ответы [ 2 ]

1 голос
/ 21 января 2009

Попробуйте эту ссылку 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

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

0 голосов
/ 21 января 2009

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

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

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

...