Per creare un meccanismo di autenticazione sicuro si utilizzano sia certificati client sia nome utente/password. Il motivo è che un certificato è qualcosa che può essere rubato (copiato) ma una password è qualcosa che è noto solo alla persona. Un'alternativa potrebbe essere un certificato su una smartcard, protetta da un PIN.
Per utilizzare i certificati client in applicazioni ASP.NET è necessario effettuare le seguenti operazioni:
Fase 1: In Gestione IIS, aprire l'applicazione o sito web, selezionare Impostazioni SSL e scegliere sia richiedere SSL e richiedono Certificato cliente
Ora quando l'utente apre il tuo sito web, il browser gli chiederà di selezionare un certificato client che verrà utilizzato nella comunicazione.
Importante A questo punto è necessario assicurarsi che il certificato sia emesso da qualcuno di cui ci si fida (poiché chiunque può creare i propri certificati autofirmati).
Passaggio 2: Aggiungere un elemento di configurazione (web.config, database ecc.). In questo elenco si aggiungerebbero le impronte digitali dell'intera catena CA (autorità di certificazione) per i certificati client.
<add key="ClientCertificateIssuerThumbprints" value="4901f5b87d736cd88792bd5ef7caee91bf7d1a2b,0113e31aa85d7fb02740a1257f8bfa534fb8549e,c9321de6b5a82666cf6971a18a56f2d3a8675602"/>
Fase 3: creare una pagina classica di login username/password. Verifica il nome utente/password.
Fase 4: Aggiungere il seguente codice alla tua pagina di login:
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.");
solo quando sia la password e il certificato sono stati controllati, l'utente dovrebbe essere consentito nel sistema.
Qual è il punto del certificato se il cliente può esportarlo e installarlo dove vuole? Username/password mi assicura l'autenticità dell'utente, ma ho anche bisogno di garantire l'autenticità della macchina. – enb081
È possibile installare un certificato in modo che le chiavi private (richieste per l'autenticazione) non possano essere esportate. Alcuni laptop consentono di installare i certificati in un chip hardware. Un'alternativa sarebbe quella di memorizzare il certificato in una smartcard. –
Se si trova il certificato del client sufficiente, lo si utilizza per l'autenticazione: http://www.iis.net/configreference/system.webserver/security/authentication/iisclientcertificatemappingauthentication – flup