2013-02-18 16 views
21

Ho un'applicazione asp.net e ho bisogno di autenticare gli utenti usando i certificati X509. Cioè, l'utente deve installare un certificato emesso da me in modo che possa sfogliare il mio sito Web e posso identificare quale utente è, da questo certificato.Autenticazione client tramite certificati X509 in asp.net

Ho già configurato SSL su IIS, ma non è quello che sto cercando in questo momento, e non so da dove iniziare.

Come posso ottenere questo in asp.net C#?

risposta

20

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.

+0

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

+0

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

+1

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

8

Supponendo di avere IIS 7.0 o superiore, è possibile configurare Autenticazione mapping certificati client

Using Active Directory (Estremamente facile, lascia il lavoro di mappatura al server 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> 

O using IIS (More configurazione necessaria in IIS, richiede l'accesso al certificato client, ma funziona in modo autonomo, senza roundtrips all'AD).In questo caso, si specifica (uno o più) le credenziali utente e

  • mappa ad ogni utente di chiave pubblica di un certificato a un utente le cui credenziali si specifica, o
  • mappa più certificati a un utente in base ai valori di i campi del certificato

di configurazione (molti a uno):

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

(esempio di configurazione piuttosto spudoratamente copiato dai campioni sulla iis.net fare pagine di documentazione, che sono piuttosto elaborate.)

Oppure è possibile configurare l'applicazione su use Claims-Based Authentication con un token di sicurezza (STS) che autentica i client in base ai certificati client. ADFS 2.0 è in grado di completare questo ruolo oppure, se non è disponibile, è possibile consultare Thinktecture Identity Server.