2013-02-18 3 views
21

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

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

Как добиться этого в asp.net C#?

ответ

20

Чтобы создать безопасный механизм аутентификации, вы должны использовать как клиентские сертификаты, так и имя пользователя/пароль. Причина в том, что сертификат - это то, что можно украсть (скопировать), но пароль - это то, что известно только человеку. Альтернативой может быть сертификат на смарт-карте, защищенный 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."); 

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

+0

В чем смысл сертификата, если клиент может его экспортировать и установить там, где он хочет? Имя пользователя/пароль гарантирует мне достоверность пользователя, но мне также необходимо убедиться в подлинности машины. – enb081

+0

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

+1

Если вы достаточно находите сертификат клиента, вы используете его для аутентификации: http://www.iis.net/configreference/system.webserver/security/authentication/iisclientcertificatemappingauthentication – flup

8

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

Using 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> 

Или using 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 сделать страниц, которые достаточно сложны.)

Или вы можете настроить ваше приложение на use Claims-Based Authentication с помощью службы маркеров безопасности (STS), которая проверяет подлинность клиентов на основе клиентских сертификатов. ADFS 2.0 может полностью заполнить эту роль, или если она недоступна, вы можете посмотреть на Thinktecture Identity Server.

Смежные вопросы