es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo personalizar Microsoft.Owin.Security.OAuth para utilizar un certificado sin que IIS lo valide.

Espero estar haciendo la pregunta correctamente.

Tengo el siguiente caso de uso. Tengo una aplicación que quiero ejecutar en https y que el usuario pase un x509. Sin embargo, quiero enviar esa autenticación a un LDAP externo y no quiero que IIS autentique/verifique el certificado.

Si entro en IIS y lo configuro para aceptar/requerir, obtengo un error 403. Si no lo requiero, nunca me solicita el certificado.

Mi clase de inicio se ve así:

public class Startup {
    public void Configuration(IAppBuilder app) {
        app.UseClientCertificateAuthentication(new DefaultClientCertificateValidator());
    }
}

Luego tengo:

public class DefaultClientCertificateValidator : IClientCertificateValidator {
    public ClientCertificateValidationResult Validate(X509Certificate2 certificate) {
        Console.WriteLine($"Intentando validar el certificado {certificate.SubjectName}");
        // Por ahora, solo devuelvo true
        ClientCertificateValidationResult res = new ClientCertificateValidationResult(true);
        return res;
    }
}

Si no paso un certificado, se produce un error porque no pudo encontrar un certificado. Sin embargo, si intento enviar un certificado, obtengo el error del servidor:

403 – Prohibido: El acceso está denegado.
No tiene permiso para ver este directorio o página utilizando las credenciales que ha proporcionado.

¿Hay algo en IIS que deba hacer para decir básicamente “Obtén el certificado, envíalo pero NO lo autentiques”?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándose en el caso de uso proporcionado, parece que el usuario desea utilizar un servidor LDAP externo para la validación del certificado del cliente en lugar de IIS. Para lograr esto, se pueden seguir los siguientes pasos:

    1. Desactivar la autenticación del certificado del cliente en IIS estableciéndola en “Ignorar”.
    2. En la clase de inicio de OWIN, utilizar el middleware UseClientCertificateAuthentication con un validador personalizado que enviará el certificado al servidor LDAP externo para su validación.
    3. En el método Validate del validador personalizado, realizar la llamada LDAP necesaria para validar el certificado. Si el certificado es válido, devolver true como resultado de la validación. De lo contrario, devolver false.
    4. Si el certificado es válido, permitir que la cadena de middlewares continúe procesando la solicitud. Si el certificado no es válido, devolver un error 403.

    Para desactivar la autenticación del certificado del cliente en IIS:

    1. Abrir el Administrador de IIS y seleccionar la aplicación objetivo.
    2. Hacer clic en la función “Configuración de SSL”.
    3. Establecer “Certificados del cliente” en “Ignorar”.

    Para modificar la clase de inicio de OWIN para la autenticación del certificado del cliente:

        public class Startup {
            public void Configuration(IAppBuilder app) {
                var validador = new DefaultClientCertificateValidator();
                app.Use(async (ctx, next) => {
                    // Obtener el certificado del cliente de la solicitud.
                    var certificado = ctx.Request.ClientCertificate;
    
                    // Validar el certificado con el validador personalizado.
                    var resultadoValidacion = validador.Validate(certificado);
    
                    if (resultadoValidacion.IsValid) {
                        // Permitir que la cadena de middlewares continúe procesando la solicitud.
                        await next();
                    } else {
                        // Devolver un error 403 si el certificado no es válido.
                        ctx.Response.StatusCode = 403;
                    }
                });
            }
        }
    

    Cabe destacar que el código anterior asume que la lógica de validación LDAP ha sido implementada en el método Validate de la clase DefaultClientCertificateValidator.

    Al establecer que IIS ignore los certificados de cliente, el middleware en la clase de inicio de OWIN podrá recuperar el certificado del cliente de la solicitud. Luego, el validador personalizado puede validar el certificado con el servidor LDAP externo y devolver un resultado de validación, que determinará si la cadena de middlewares continúa procesando la solicitud o devuelve un error 403.

Comments are closed.