ASP. Net Core Secure Cookie detrás de Azure Application Gateway

Tengo un ASP. Aplicación Net Core 3.1 que solía ser hospedado en un Azure WebApp con SSL habilitado. Ahora necesito mover la aplicación a un Kubernetes Cluster (AKS gestionado). Para ingresos, se utiliza un portal de aplicaciones Azure, que también maneja y termina la conexión SSL. Como resultado, todo el tráfico se desplaza desde el Portal de Aplicación a la aplicación a través de HTTP (sin SSL) y ASP no establece la Secure atributo (que se requiere en Chrome debido a SameSite=None) en la cookie requerida para la autenticación. Following the Microsoft Docs en relación con el alojamiento ASP detrás de los proxies o balanceadores de carga, ya incluí

app.UseForwardedHeaders(new ForwardedHeadersOptions {
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedProto
});

Sin embargo, el login falla en el cromo y puedo ver en las herramientas del navegador que la cookie no tiene el atributo seguro. Uso las siguientes opciones de cookies:

services.Configure(options => {
    options.CheckConsentNeeded = context => true;
    options.HttpOnly = HttpOnlyPolicy.Always;
    options.Secure = CookieSecurePolicy.Always;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

Pregunta hecha hace 3 años, 4 meses, 29 días - Por debugdynamo46a0


2 Respuestas:

  • Para resolver este problema y asegurarte de que la cookie tenga el atributo Secure correctamente establecido, puedes configurar tu aplicación ASP.NET Core para que reconozca que está detrás de un proxy inverso (en este caso, Azure Application Gateway).

    Una solución posible es configurar los encabezados en tu clase Startup.cs para permitir la detección correcta de las conexiones seguras establecidas a través de Azure Application Gateway. Puedes hacerlo de la siguiente manera:

    csharp
    app.Use((context, next) =>
    {
        context.Request.Scheme = "https";
        return next();
    });
    
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
        KnownProxies = { IPAddress.Parse("") }, // Añade la dirección IP de tu Azure Application Gateway
    });
    
    app.UseAuthentication();
    

    En este código:

    • Establecemos el esquema de la solicitud como `https` para que ASP.NET Core genere correctamente las cookies seguras.
    • Configuramos los `ForwardedHeaders` con `XForwardedFor` y `XForwardedProto` para que ASP.NET Core pueda interpretar adecuadamente las conexiones seguras.
    • Agregamos la dirección IP de tu Azure Application Gateway a `KnownProxies`, lo que permite que ASP.NET Core confíe en los encabezados de estos proxys anteriores.

    Con esta configuración, ASP.NET Core debería generar las cookies con el atributo Secure establecido correctamente, lo que resolverá el problema de la autenticación fallida en Chrome debido a la política SameSite=None.

    Es importante tener en cuenta que debes reemplazar <Dirección IP del Azure Application Gateway> con la dirección IP real de tu Azure Application Gateway.

    Espero que esta solución te ayude a solucionar el problema. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 17, 2020 a las 10:31 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para resolver el problema de que las cookies seguras no se establecen detrás de Azure Application Gateway con ASP.NET Core, puedes intentar lo siguiente:

    1. Habilitar el encabezado "X-Forwarded-Proto"

    Asegúrate de que tu proxy o Application Gateway agregue el encabezado "X-Forwarded-Proto" a las solicitudes. Este encabezado indica el protocolo utilizado en la solicitud original (por ejemplo, "https").

    2. Configurar la capa de balanceo de carga para reenviar el encabezado "X-Forwarded-Proto"

    Configura tu capa de balanceo de carga o Application Gateway para reenviar el encabezado "X-Forwarded-Proto" a la aplicación ASP.NET Core.

    3. Establecer manualmente el esquema de solicitud

    En el código ASP.NET Core, puedes establecer manualmente el esquema de solicitud (por ejemplo, "https") utilizando el siguiente código:

    csharp
    app.Use((context, next) =>
    {
        context.Request.Scheme = "https";
        return next();
    });
    

    Esto asegurará que la aplicación considere que la solicitud se realizó a través de HTTPS, incluso si se recibió a través de HTTP.

    4. Usar el middleware "Hsts"

    El middleware "Hsts" obliga al navegador a usar HTTPS para todas las solicitudes a la aplicación. Puedes agregar este middleware a la canalización de tu aplicación como se muestra a continuación:

    csharp
    app.UseHsts(options =>
    {
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(365);
        options.Preload = true;
    });
    

    5. Verificar que el proxy o Application Gateway admita la terminación SSL

    Asegúrate de que el proxy o Application Gateway que utilizas admita la terminación SSL. Esto significa que el proxy debe descifrar el tráfico SSL entrante y reenviarlo a la aplicación a través de una conexión HTTP o TCP simple.

    Ejemplo de código actualizado:

    csharp
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedProto
    });
    
    app.Use((context, next) =>
    {
        context.Request.Scheme = "https";
        return next();
    });
    
    app.UseHsts(options =>
    {
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(365);
        options.Preload = true;
    });
    
    services.Configure(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.HttpOnly = HttpOnlyPolicy.Always;
        options.Secure = CookieSecurePolicy.Always;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    

    Después de implementar estos cambios, las cookies seguras deberían establecerse correctamente detrás de Azure Application Gateway, incluso si el tráfico se enruta a través de HTTP.

    Respondida el Dec 17, 2020 a las 10:42 - por Gemini

    Votos positivos: 0 | Votos negativos: 0