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.

ASP.NET Core MVC sesión misma URL del sitio

Tengo 2 aplicaciones ASP.NET Core MVC ejecutándose en diferentes puertos en una IP (por ejemplo, App1: 192.168.0.1:8000 y App2: 192.168.0.1:8001).

Después de iniciar sesión en App1 y luego iniciar sesión en App2, App1 creará un nuevo SessionId para la siguiente solicitud, por lo que no puede obtener la antigua sesión para los datos de autenticación.

Lo configuro de la siguiente manera en startup.cs

public void ConfigureServices(IServiceCollection services) 
{
    ....
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    ....
    services.AddDistributedMemoryCache();           
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(60);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
     });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{
    ....    
    app.UseCookiePolicy();
    app.UseSession();
    ....
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con los ID de sesión separados entre App1 y App2 se puede resolver compartiendo la misma sesión entre las dos aplicaciones. Esto se puede lograr configurando una caché distribuida para almacenar los datos de sesión, como el uso de Redis o SQL Server, en lugar de la caché en memoria predeterminada.

    En ConfigureServices, reemplace services.AddDistributedMemoryCache(); con un proveedor de caché distribuida como Redis o SQL Server. Por ejemplo, para usar Redis:

    services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = "localhost";
        options.InstanceName = "Session";
    });
    

    En Configure, agregue el siguiente middleware para configurar la sesión compartida:

    app.UseSession(new SessionOptions
    {
        Cookie = new CookieOptions
        {
            // Establecer un nombre único para la cookie de sesión
            Name = "SharedSessionId"
        },
        // Utilizar la caché distribuida en lugar de la caché en memoria
        // Esto asume que se ha configurado un proveedor de caché distribuida en ConfigureServices
        Store = new RedisCacheSessionStore(app.ApplicationServices.GetRequiredService<iconnectionmultiplexer>())
    });
    
    // Este middleware debe agregarse después de UseSession pero antes de UseMvc
    // Asegura que la cookie de sesión compartida se establezca correctamente y se envíe en la respuesta
    app.Use(async (context, next) =>
    {
        var cookieValue = context.Request.Cookies["SharedSessionId"];
    
        if (string.IsNullOrEmpty(cookieValue))
        {
            // Generar un nuevo ID de sesión si no existe uno
            cookieValue = Guid.NewGuid().ToString();
            context.Response.Cookies.Append("SharedSessionId", cookieValue, new CookieOptions
            {
                HttpOnly = true
            });
        }
    
        context.Request.Headers.Add("Cookie", $"SharedSessionId={cookieValue}");
        await next.Invoke();
    });
    

    Tenga en cuenta que este middleware asume que la cookie de sesión compartida se llama “SharedSessionId”. Esto se puede cambiar a cualquier nombre único deseado.

    Con los cambios anteriores, tanto App1 como App2 utilizarán el mismo ID de sesión y podrán acceder a los datos de sesión compartidos.

Comments are closed.