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.

Problema de token Antiforgery de ASP.NET Core con dos aplicaciones en un único dominio.

Tengo una aplicación de una sola página (SPA) ASP.NET Core 3.1 que utiliza Microsoft.AspDotNetCore.Antiforgery.

Agrego el servicio Antiforgery en el método ConfigureServices, de la siguiente manera:

_ = services.AddAntiforgery((o) =>
    {
        o.HeaderName = "X-XSRF-TOKEN";
    });

En el método Configure, se agrega el middleware para añadir la cookie de antiforgery a la respuesta HTTP:

app.Use(async (context, next) =>
{
     var tokens = antiForgery.GetAndStoreTokens(context);
     context.Response.Cookies.Append("XSRF-TOKEN",
     tokens.RequestToken, new CookieOptions
     {
         HttpOnly = false,
         Secure = false,
         IsEssential = true,
         SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict
      }
      );
      await next();
});

Tengo un solo dominio donde se ejecutan dos aplicaciones (por ejemplo, https://example.com/test y https://example.com/master). Cuando abro ambas aplicaciones en el navegador, obtengo respuestas aleatorias de BadRequest 400. Cuando solo abro una aplicación en el navegador, funciona muy bien.

Creo que ambas aplicaciones afectan a la misma cookie de antiforgery, pero no sé cómo ni por qué.

¿Existe alguna solución para mi problema? Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible que ambas aplicaciones estén compartiendo la misma cookie de protección contra falsificación, lo que causa conflictos y da como resultado respuestas 400 BadRequest. Una solución a este problema es especificar un nombre de cookie único de protección contra falsificación para cada aplicación. Esto se puede hacer agregando el siguiente código al método Configure de cada aplicación:

    app.Use((context, next) =>
    {
        var antiforgery = context.RequestServices.GetService<iantiforgery>();
        var tokens = antiforgery.GetAndStoreTokens(context);
        context.Response.Cookies.Append("XSRF-TOKEN-<nombredeaplicacion>",
            tokens.RequestToken,
            new CookieOptions
            {
                HttpOnly = false,
                Secure = false,
                IsEssential = true,
                SameSite = SameSiteMode.Strict
            });
        return next();
    });
    

    Reemplaza <nombredeaplicacion> con un nombre único para cada aplicación (por ejemplo, test y master). Este código crea una nueva cookie de protección contra falsificación con un nombre único para cada aplicación, evitando que entren en conflicto entre sí.

    Asegúrate de actualizar la configuración de protección contra falsificación en ConfigureServices para usar el nuevo nombre de la cookie:

    _ = services.AddAntiforgery((o) =>
    {
        o.HeaderName = "X-XSRF-TOKEN-<nombredeaplicacion>";
    });
    

    Reemplaza <nombredeaplicacion> con el mismo nombre utilizado en el método Configure.

    Ten en cuenta que esta solución solo es aplicable si ambas aplicaciones están alojadas en el mismo dominio. Si las aplicaciones están alojadas en subdominios o dominios diferentes, considera habilitar cookies entre dominios configurando la propiedad CookieDomain del objeto CookieOptions.

Comments are closed.