Аутентификация клиента через сертификаты X509 в asp.net

Ищете ответы на эту проблему, я наткнулся на эту ссылку

Кажется, что Hibernate / JPA не может автоматически создать значение для вашего не-id- свойства. Аннотации @GeneratedValue используются только в сочетании с @Id для создания автоматических номеров.

Аннотация @GeneratedValue просто сообщает Hibernate, что база данных сама генерирует это значение.

Решение (или обход), предлагаемое на этом форуме, заключается в создании отдельного объекта с генерируемым идентификатором, что-то вроде этого:

@Entity
public class GeneralSequenceNumber {
  @Id
  @GeneratedValue(...)
  private Long number;
}

@Entity 
public class MyEntity {
  @Id ..
  private Long id;

  @OneToOne(...)
  private GeneralSequnceNumber myVal;
}

24
задан Travis Pessetto 8 June 2017 в 00:26
поделиться

2 ответа

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

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

Шаг 1: В IIS Manager откройте свое приложение или веб-сайт, выберите «Настройки 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.");

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

22
ответ дан Knaģis 8 June 2017 в 00:26
поделиться

Предполагая, что у вас 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 Identity Server .

9
ответ дан flup 8 June 2017 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: