web-dev-qa-db-fra.com

Authentification client via les certificats X509 dans asp.net

J'ai une application asp.net et j'ai besoin d'authentifier les utilisateurs à l'aide de certificats X509. Autrement dit, l'utilisateur doit installer un certificat émis par moi afin qu'il puisse parcourir mon site Web et que je puisse identifier quel utilisateur est, par ce certificat.

J'ai déjà configuré SSL sur IIS, mais ce n'est pas ce que je recherche en ce moment, et je ne sais pas par où commencer.

Comment puis-je y parvenir dans asp.net c #?

24
enb081

Pour créer un mécanisme d'authentification sécurisé, vous utiliseriez à la fois les certificats clients et le nom d'utilisateur/mot de passe. La raison en est qu'un certificat est quelque chose qui peut être volé (copié) mais qu'un mot de passe est quelque chose qui n'est connu que de la personne. Une alternative pourrait être un certificat sur une carte à puce, protégé par un code PIN.

Pour utiliser des certificats clients dans des applications ASP.NET, vous devez procéder comme suit:

Étape 1: Dans IIS Manager, ouvrez votre application ou votre site Web, choisissez Paramètres SSL et choisissez Exiger SSL et Exiger le certificat client.

Désormais, lorsque l'utilisateur ouvre votre site Web, le navigateur l'invite à sélectionner un certificat client qui sera utilisé dans la communication.

Important À ce stade, vous devez vous assurer que le certificat est émis par une personne de confiance (car n'importe qui peut créer ses propres certificats auto-signés).

Étape 2: Ajoutez un élément de configuration (soit web.config, base de données, etc.). Dans cette liste, vous ajouteriez les empreintes de toute la chaîne CA (autorité de certification) pour vos certificats clients.

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

Étape 3: Créez une page de connexion nom d'utilisateur/mot de passe classique. Vérifiez le nom d'utilisateur/mot de passe.

Étape 4: Ajoutez le code suivant à votre page de connexion:

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.");

Ce n'est que lorsque le mot de passe et le certificat ont été vérifiés que l'utilisateur doit être autorisé à accéder au système.

23
Knaģis

En supposant que vous avez IIS 7.0 ou supérieur, vous pouvez configurer l'authentification de mappage de certificat client

tilisation d'Active Directory (Extrêmement facile, laisse le travail de mappage au serveur 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>

Ou en utilisant IIS (Plus de configuration est nécessaire dans IIS, a besoin d'accéder au certificat client, mais fonctionne de manière autonome, pas d'allers-retours vers l'AD). Dans ce cas, vous spécifiez (un ou plusieurs) identifiants utilisateur et

  • mappez chaque utilisateur à la clé publique d'un certificat à un utilisateur dont vous spécifiez les informations d'identification, ou
  • mappez plusieurs certificats à un utilisateur en fonction des valeurs des champs du certificat

Configuration (plusieurs à un):

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

(Exemple de configuration copiée sans vergogne à partir des exemples sur les pages de documentation iis.net, qui sont assez élaborées.)

Ou vous pouvez configurer votre application pour tiliser l'authentification basée sur les revendications avec un service de jeton de sécurité (STS) qui authentifie les clients en fonction des certificats clients. ADFS 2.0 peut remplir ce rôle, ou s'il n'est pas disponible, vous pouvez consulter le Thinktecture Identity Server .

10
flup