Создание веб-службы .NET с проверкой подлинности сертификата клиента. - PullRequest
3 голосов
/ 01 июля 2011

Я хочу ограничить доступ к моей веб-службе .NET определенным списком клиентов. Они будут прикреплять свой клиентский сертификат к каждому запросу и получать правильный ответ, только если они «в списке».

Но как и где это лучше всего сделать?

В IIS (7.0) я могу установить параметр «Требовать сертификат клиента», но где я могу указать, к каким сертификатам клиента я получу доступ? Нужна ли публичная часть клиентских сертификатов в хранилище сертификатов компьютера веб-сервера?

Или необходимо выполнить настройку, подобную этой, в коде, где я каким-то образом извлекаю идентификатор сертификата клиента и сопоставляю его с локальным списком?

Или по-другому?

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Один из способов создания службы WCF на IIS7 с вашими требованиями безопасности заключается в следующем.

Чтобы разместить службу WCF, вам может потребоваться выполнить следующую команду на вашем веб-сервере:

"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r –y

В IIS вы настраиваете свой сайт с привязкой https (только), а в настройках SSL вы устанавливаете для него требование SSL и клиентские сертификаты.

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

Чтобы ограничить доступ к определенным сертификатам, вы можете настроить файл конфигурации WCF с привязкой конфигурации как:

<basicHttpBinding>
  <binding name="MyBasicHttpBinding">
    <security mode="Transport">
      <transport clientCredentialType="Certificate" />
    </security>
  </binding>
</basicHttpBinding>

И поведение Configuration с настраиваемым валидатором сертификата как:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceCredentials>
        <clientCertificate>
          <authentication certificateValidationMode="Custom"
            customCertificateValidatorType="<project-namespace>.ClientCertificateValidator, <project-namespace>"/>
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

И наконец, реализуйте пользовательский валидатор в новом классе в вашем проекте как:

public class ClientCertificateValidator : X509CertificateValidator
{
    public override void Validate(X509Certificate2 certificate)
    {
      if (certificate.Thumbprint != <allowed-thumbprint>)
        throw new Exception();
    }
}
1 голос
/ 01 июля 2011

Если эти клиентские сертификаты происходят из определенного корневого ЦС, вы можете использовать CTL .

В противном случае, я думаю, у вас есть следующие варианты (в зависимости от ваших потребностей):

  • Если у вас есть доступ к клиентским сертификатам .cer-файлов, вы можете использовать сопоставление клиентских сертификатов и сопоставить их с учетными записями Windows, выборочно сгруппировать их в группы AD / local и получить соответствующие разрешения.
  • Извлечение имени участника-пользователя в коде (возможно, в обработчике HTTP) и проверка по списку предоставленных номеров имени пользователя
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...