Пользовательский сертификат клиента и проверка имени пользователя в службе WCF

Моя конкретная проблема примерно такая:

  • В настоящее время мы работаем с набором служб, который требует от клиентов предоставления имени пользователя и пароля в качестве аутентификации при вызове служб.

  • Мы хотели бы внедрить PKI-инфраструктуру для этих служб, но некоторые из наших партнеров будут использовать больше времени для адаптации к этой новой инфраструктуре, чем другие.

  • В качестве первого шага мы хотим потребовать сертификаты клиентов от некоторых наших партнеров. Для доступа к их данным на наших серверах потребуется сертификат клиента (в дополнение к имени пользователя и паролю), а для других пользователей потребуются только имя пользователя и пароль.

Для решения этой проблемы я пытаюсь реализовать собственный валидатор как для аутентификации имени пользователя и пароля (с использованием UserNamePasswordValidator), так и для клиентских сертификатов (с использованием X509CertificateValidator) в WCF. Валидатор имени пользователя / пароля проверит эти учетные данные в нашей базе данных, в то время как валидатор сертификата клиента проверит, поступает ли запрос от клиента, от которого нам требуется сертификат, и, если да, подтвердит, что предоставлен действительный сертификат клиента. Мне не удалось настроить WCF так, чтобы он использовал оба этих валидатора.

Моя конфигурация WCF на сервере в настоящее время настроена следующим образом:


  
    
      
      
      
        
          
        
        
      
    
  



  
    
      
        
        
      
    
  


  
    
    
      
        
      
    
  

Насколько я понимаю, эта конфигурация недействительна, потому что я не могу использовать customCertificateValidatorType на транспортном уровне (поскольку IIS проверяет сертификат до того, как здесь задействован WCF), но я не вижу, как я могу объединить customCertificateValidatorType и customUserNamePasswordValidatorType в качестве типов учетных данных на уровне сообщений.

Я реализовал инспектор сообщений и, возможно, смогу каким-то образом решить проблему с помощью OperationContext (как предлагается в приведенной ниже ссылке), но я пока не видел, как это сделать. ...

http://social.msdn.microsoft.com/Forums/en/wcf/thread/b6ab8b58-516b-41d4-bb0e-75b4baf92716

Полагаю, я пытаюсь реализовать что-то несовместимое с тем, как работает WCF, но если у кого-то есть идея, как это можно исправить, я был бы рад получить ваш отзыв по этому поводу!

7
задан Hanskun 5 July 2011 в 13:16
поделиться