asp.net authentication digital-certificate

Autenticación de cliente a través de certificados X509 en asp.net



authentication digital-certificate (2)

Para crear un mecanismo de autenticación seguro, debe usar tanto los certificados del cliente como el nombre de usuario / contraseña. La razón es que un certificado es algo que puede ser robado (copiado) pero una contraseña es algo que solo conoce la persona. Una alternativa podría ser un certificado en una tarjeta inteligente, protegido por un PIN.

Para usar certificados de cliente en aplicaciones ASP.NET debe hacer lo siguiente:

Paso 1: en el Administrador de IIS, abra su aplicación o sitio web, elija Configuración de SSL y elija Requerir SSL y Requerir certificado de cliente.

Ahora cuando el usuario abre su sitio web, el navegador le pedirá que seleccione un certificado de cliente que se utilizará en la comunicación.

Importante En este punto, debe asegurarse de que el certificado sea emitido por alguien de su confianza (ya que cualquiera puede crear sus propios certificados autofirmados).

Paso 2: agregue un elemento de configuración (ya sea web.config, base de datos, etc.). En esta lista, debe agregar las huellas digitales de toda la cadena de CA (autoridad de certificación) para sus certificados de cliente.

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

Paso 3: crea una página clásica de inicio de sesión de nombre de usuario / contraseña. Verifique el nombre de usuario / contraseña.

Paso 4: agregue el siguiente código a su página de inicio de sesión:

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 cuando se hayan verificado tanto la contraseña como el certificado, se debe permitir que el usuario ingrese al sistema.

Tengo una aplicación asp.net y necesito autenticar usuarios usando certificados X509. Es decir, el usuario debe instalar un certificado emitido por mí para que pueda explorar mi sitio web y pueda identificar qué usuario es, mediante este certificado.

Ya he configurado SSL en IIS, pero no es lo que estoy buscando en este momento, y no sé por dónde empezar.

¿Cómo puedo lograr esto en asp.net c #?


Suponiendo que tiene IIS 7.0 o superior, puede configurar Autenticación de asignación de certificados de cliente

Usando Active Directory (extremadamente fácil, deja el trabajo de mapeo al servidor 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 iis.net/configreference/system.webserver/security/… (Se necesita más configuración en IIS, necesita acceso al certificado del cliente, pero funciona de forma independiente, sin ida y vuelta a AD). En este caso, especifica (una o más) credenciales de usuario y

  • asignar a cada usuario a la clave pública de un certificado para un usuario cuyas credenciales especifique, o
  • asignar múltiples certificados a un usuario en función de los valores en los campos del certificado

Configuración (muchos 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>

(La configuración de muestra se copia sin vergüenza de las muestras en las páginas de documentación de iis.net, que son bastante elaboradas).

O puede configurar su aplicación para utilizar la autenticación basada en notificaciones con un servicio de token de seguridad (STS) que autentica a los clientes según los certificados del cliente. ADFS 2.0 puede completar esta función o, si no está disponible, puede consultar el Thinktecture Identity Server .