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

Аутентификация клиента с помощью сертификатов X509 в asp.net

У меня есть приложение asp.net, и мне нужно аутентифицировать пользователей, используя сертификаты X509. То есть пользователь должен установить сертификат, выпущенный мной, чтобы он мог просматривать мой сайт, и я могу определить, какой пользователь является этим сертификатом.

Я уже настроил SSL на IIS, но это не то, что я ищу прямо сейчас, и я не знаю, с чего начать.

Как я могу достичь этого в asp.net С#?

4b9b3361

Ответ 1

Чтобы создать механизм безопасной аутентификации, вы должны использовать как клиентские сертификаты, так и имя пользователя/пароль. Причина в том, что сертификат - это то, что можно украсть (скопировать), но пароль - это то, что известно только человеку. Альтернативой может быть сертификат на смарт-карте, защищенный PIN-кодом.

Чтобы использовать клиентские сертификаты в приложениях ASP.NET, вам необходимо сделать следующее:

Шаг 1: В диспетчере IIS откройте приложение или веб-сайт, выберите "Настройки SSL" и выберите "Требовать SSL" и "Требовать сертификат клиента".

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

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

Шаг 2: Добавьте элемент конфигурации (либо web.config, базу данных и т.д.). В этом списке вы должны добавить отпечатки всей цепочки CA (центра сертификации) для своих клиентских сертификатов.

<add key="ClientCertificateIssuerThumbprints" value="4901f5b87d736cd88792bd5ef7caee91bf7d1a2b,0113e31aa85d7fb02740a1257f8bfa534fb8549e,c9321de6b5a82666cf6971a18a56f2d3a8675602"/>

Шаг 3: Создайте классическую страницу входа в систему имени пользователя и пароля. Проверьте имя пользователя и пароль.

Шаг 4: Добавьте следующий код на страницу входа в систему:

var x509 = new X509Certificate2(this.Request.ClientCertificate.Certificate);
var chain = new X509Chain(true);
chain.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
chain.Build(x509);

var validThumbprints = new HashSet<string>(
    System.Configuration.ConfigurationManager.AppSettings["ClientCertificateIssuerThumbprints"]
        .Replace(" ", "").Split(',', ';'),
    StringComparer.OrdinalIgnoreCase);

// if the certificate is self-signed, verify itself.
for (int i = chain.ChainElements.Count > 1 ? 1 : 0; i < chain.ChainElements.Count; i++)
{
    if (!validThumbprints.Contains(chain.ChainElements[i].Certificate.Thumbprint))
        throw new UnauthorizedAccessException("The client certificate selected is not authorized for this system. Please restart the browser and pick the certificate issued by XXXXX");
}

// certificate Subject would contain some identifier of the user (an ID number, SIN number or anything else unique). here it is assumed that it contains the login name and nothing else
if (!string.Equals("CN=" + login, x509.Subject, StringComparison.OrdinalIgnoreCase))
    throw new UnauthorizedAccessException("The client certificate selected is authorized for another user. Please restart the browser and pick another certificate.");

Только когда оба пароля и сертификат были проверены, пользователь должен быть разрешен в системе.

Ответ 2

Предполагая, что у вас IIS 7.0 или выше, вы можете настроить аутентификацию сопоставления сертификатов клиента

Использование Active Directory (Чрезвычайно просто, оставляет работу отображения на сервере AD)

<location path="Default Web Site">
   <system.webServer>
      <security>
         <access sslFlags="Ssl, SslNegotiateCert" />
          <authentication>
            <windowsAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
            <digestAuthentication enabled="false" />
            <basicAuthentication enabled="false" />
            <clientCertificateMappingAuthentication enabled="true" />
         </authentication>
     </security>
   </system.webServer>
</location>

Или с помощью IIS (требуется больше настроек в IIS, требуется доступ к сертификату клиента, но работает автономно, без обращений к AD). В этом случае вы указываете (один или несколько) учетные данные пользователя и

  • сопоставить каждого пользователя с открытым ключом сертификата для пользователя, чьи учетные данные указаны, или
  • сопоставить несколько сертификатов пользователю на основе значений в полях сертификата

Конфигурация (много к одному):

<location path="Default Web Site">
   <system.webServer>
      <security>
         <authentication>
            <windowsAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
            <digestAuthentication enabled="false" />
            <basicAuthentication enabled="false" />
            <iisClientCertificateMappingAuthentication enabled="true"
                  manyToOneCertificateMappingsEnabled="true">
               <manyToOneMappings>
                  <add name="Contoso Employees"
                        enabled="true"
                        permissionMode="Allow"
                        userName="Username"
                        password="[enc:AesProvider:57686f6120447564652c2049495320526f636b73:enc]">
                     <rules>
                        <add certificateField="Subject"
                           certificateSubField="O"
                           matchCriteria="Contoso"
                           compareCaseSensitive="true" />
                     </rules>
                  </add>
               </manyToOneMappings>
            </iisClientCertificateMappingAuthentication>
         </authentication>
         <access sslFlags="Ssl, SslNegotiateCert" />
      </security>
   </system.webServer>
</location>

(Пример конфигурации довольно бесстыдно скопирован из образцов на страницах документации iis.net, которые довольно сложны.)

Или вы можете настроить ваше приложение на использование проверки подлинности на основе утверждений с помощью службы маркеров безопасности (STS), которая проверяет подлинность клиентов на основе клиентских сертификатов. ADFS 2.0 может полностью заполнить эту роль, или если она недоступна, вы можете посмотреть Сервер идентификации Thinktecture.