Проблема безопасности WCF

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 595
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

Сертификаты используются для подписи сообщений, т. Е. доказывая, что другая сторона является реальным клиентом / службой, но авторизация частично зависит от WindowsIdentity в ServiceSecurityContect. Все, что я хочу, - включить WindowsIdentity в sec.context, а PrimaryIdentity - это X509CertIdentity.

ProfyTroll 21.01.2009 13:35

Поэтому мне нужно знать на стороне сервера, какой пользователь домена запросил операцию.

ProfyTroll 21.01.2009 13:37
Ответ принят как подходящий

Попробуйте эту ссылку 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 временами может быть болезненным!

Tanner 21.01.2009 17:50

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