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