Подтвердить что ты не робот

Проверка пользовательского сертификата в службе WCF

Я хочу проверить сертификаты клиентов в моей службе WCF.

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

Моя служба WCF размещена в IIS, я использую basicHttpBinding и режим безопасности = "транспорт" с типом удостоверения "Сертификат". IIS требует клиентских сертификатов для связи с сервисом.

Заранее благодарим за помощь.

UPDATE: Моя конфигурация:

<basicHttpBinding>
<binding 
             name="testBinding"
         maxReceivedMessageSize="2147483647">
         <readerQuotas 
                    maxDepth="2147483647"
                maxStringContentLength="2147483647"
                maxArrayLength="2147483647"
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647" />
 <security mode="Transport">
              <transport clientCredentialType="Certificate"/> 
             </security>

</binding>
</basicHttpBinding>

Поведение:

<serviceBehaviors>
    <behavior name="SomeServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceCredentials>
        <clientCertificate>
          <authentication certificateValidationMode="Custom" customCertificateValidatorType="SomeService.CustomCertificateValidator,SomeService"  />
        </clientCertificate>
      </serviceCredentials>         
     </behavior> 
   </serviceBehaviors>

Конфигурация службы:

<service 
               behaviorConfiguration="SomeServiceBehavior"
               name="SomeService">
        <endpoint 
                  address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="testBinding"
                  contract="ISomeService">
        </endpoint>
      </service>

И для целей тестирования я реализовал валидатор следующим образом:

public class CustomCertificateValidator : X509CertificateValidator
    {
        public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
        {                
            throw new SecurityTokenValidationException("TEST Certificate was not issued by a trusted issuer TEST");
        }
    }

И это не сработает. Я могу подключиться к моей службе с любым действительным сертификатом.

4b9b3361

Ответ 1

Вы можете создать класс, полученный из X509CertificateValidator, и использовать его для пользовательской проверки входящего сертификата. Выбросьте исключение SecurityTokenValidationException, если вы по какой-то причине откажитесь от проверки.

Установите для параметра certificateValidationMode значение "Пользовательский" и укажите свой валидатор в разделе поведения службы clientCertificate файла конфигурации.

Как создать службу, использующую настраиваемый сертификат Validator

Ответ 2

Я НЕ думаю, что в любом случае у вас есть "Custom Certificate Validation" с "Transport Security". Он работает только с "Безопасность сообщений".

Ответ 3

ДА, вы можете использовать basicHttpBinding с безопасностью, установленной для транспорта, и вам нужно подключиться к созданию ServiceHost в IIS - см. Пользовательский хост-узел, Вы должны иметь возможность проверять значения отпечатка пальца, сертификаты или любые другие данные, если вы создаете собственный раздел конфигурации для определения списка критериев проверки.

Пример кода для реализации всего вышеизложенного доступен в загрузке кода из этой статьи в CodeProject.