2013-02-18 8 views
21

Ich habe eine asp.net-Anwendung und ich muss Benutzer mit X509-Zertifikate authentifizieren. Das heißt, der Benutzer muss ein von mir ausgestelltes Zertifikat installieren, damit er meine Website durchsuchen kann und ich kann anhand dieses Zertifikats identifizieren, welcher Benutzer ist.Client-Authentifizierung über X509-Zertifikate in asp.net

Ich habe bereits SSL auf IIS konfiguriert, aber es ist nicht, was ich gerade suche, und ich weiß nicht, wo ich anfangen soll.

Wie kann ich dies in asp.net C# erreichen?

Antwort

20

Um einen sicheren Authentifizierungsmechanismus zu erstellen, würden Sie sowohl Client-Zertifikate als auch Benutzername/Passwort verwenden. Der Grund ist, dass ein Zertifikat etwas ist, das gestohlen (kopiert) werden kann, aber ein Passwort ist etwas, das nur der Person bekannt ist. Eine Alternative könnte ein Zertifikat auf einer Smartcard sein, das durch eine PIN geschützt ist.

Um Client-Zertifikate in ASP.NET-Anwendungen müssen Sie verwenden die folgenden Funktionen ausführen:

Schritt 1: im IIS-Manager, öffnen Sie Ihre Anwendung oder Website, wählen Sie SSL-Einstellungen und wählen Sie beide SSL erforderlich und erforderlich Client-Zertifikat

Jetzt, wenn der Benutzer Ihre Website öffnet, wird der Browser ihn auffordern, ein Client-Zertifikat auszuwählen, das in der Kommunikation verwendet wird.

Wichtig An dieser Stelle müssen Sie sicherstellen, dass das Zertifikat von einer Person ausgestellt wird, der Sie vertrauen (da jeder Benutzer selbst signierte Zertifikate erstellen kann).

Schritt 2: Fügen Sie ein Konfigurationselement hinzu (entweder web.config, Datenbank usw.). In dieser Liste würden Sie die Fingerabdrücke der gesamten Zertifizierungsstellenkette für Ihre Clientzertifikate hinzufügen.

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

Schritt 3: erstellen klassische Benutzername/Passwort-Anmeldeseite. Überprüfen Sie den Benutzernamen/das Passwort.

Schritt 4: Fügen Sie den folgenden Code in Ihre Login-Seite:

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

Nur wenn sowohl das Passwort und das Zertifikat überprüft worden sind, sollte der Benutzer im System zugelassen werden.

+0

Was ist der Sinn des Zertifikats, wenn der Client es exportieren und installieren kann, wo immer er will? Benutzername/Passwort stellt mich über die Authentizität des Benutzers sicher, aber ich muss auch die Echtheit der Maschine sicherstellen. – enb081

+0

Ein Zertifikat kann installiert werden, damit die privaten Schlüssel (für die Authentifizierung erforderlich) nicht exportiert werden können. Bei einigen Laptops können Sie die Zertifikate auf einem Hardwarechip installieren. Eine Alternative wäre, das Zertifikat in einer Smartcard zu speichern. –

+1

Wenn Sie das Client-Zertifikat genug finden, verwenden Sie es für die Authentifizierung: http://www.iis.net/configreference/system.webserver/security/authentication/iisclientcertificatemappingauthentication – flup

8

Angenommen, Sie haben IIS 7.0 oder höher, können Sie Clientzertifikatzuordnung-Authentifizierung konfigurieren

Using Active Directory (Extrem leicht, lässt die Kartierungsarbeiten auf dem AD-Server)

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

Oder using IIS (Weitere Konfiguration erforderlich benötigt in IIS Zugriff auf das Client-Zertifikat, funktioniert aber eigenständig, keine Roundtrips zum AD).In diesem Fall geben Sie (ein oder mehr) Benutzer-Credentials und

  • Karte jeden Benutzer ein öffentlichen Schlüssel des Zertifikats an einen Benutzer, deren Anmeldeinformationen geben Sie oder
  • Karte mehrere Zertifikate für einen Benutzer basierend auf Werten in das Zertifikat der Felder

Konfiguration (viele zu eins):

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

(Beispielkonfiguration eher schamlos von den Proben auf der iis.net kopiert tun Seiten

Oder Sie können Ihre Anwendung zu use Claims-Based Authentication mit einem Security Token Service (STS) konfigurieren, die Clients basierend auf Client-Zertifikate authentifiziert. ADFS 2.0 kann diese Rolle erfüllen, oder wenn es nicht verfügbar ist, können Sie sich die Thinktecture Identity Server ansehen.

Verwandte Themen