¿Cómo puedo logotipoar en el servidor con ASP. NET Core Identity con autenticación de cookies?

Estoy usando un net5.0 proyecto con 5.0.1 Paquetes de Microsoft.

Cuando un usuario indica que estoy llamando SignInManager.SignOutAsync para firmarlos. Esto eliminará la cookie en el navegador. Si guardas esa cookie antes de iniciar sesión, podrás poner la cookie de nuevo en el navegador, o en un navegador completamente diferente, y volver a autenticarte.

¿Hay una manera de firmar en el servidor para que si la cookie se utiliza después de una señal, ya no será válida?

Debe haber algo además de la cookie en el servidor porque si reinicia el servidor, la cookie ya no funciona.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por logiclinguist


3 Respuestas:

  • Cookie tiene un identificador único(sesión) para la sesión actual, que se utiliza para identificar un navegador con datos de sesión en el servidor.

    Normalmente, la sesión se perderá cuando el servidor reinicia, por lo que la cookie será inválida.

    Respondida el Dec 18, 2020 a las 16:34 - por syntaxsensei

    Votos positivos: 0 | Votos negativos: 0

  • Para evitar que la cookie siga siendo válida después de llamar a SignInManager.SignOutAsync, puedes habilitar la invalidación de tokens en ASP.NET Core Identity. Esto garantiza que los tokens asociados con la cookie de autenticación serán invalidados en el servidor después de la llamada a SignOutAsync, por lo que la cookie ya no será válida incluso si se vuelve a utilizar.

    Para habilitar la invalidación de tokens en ASP.NET Core Identity, puedes seguir estos pasos:

    • En el archivo `Startup.cs`, dentro del método `ConfigureServices`, puedes configurar las opciones de Identity para que los tokens se invaliden al momento de cerrar la sesión:
    csharp
    services.AddIdentity(options =>
    {
        // Otras configuraciones de Identity
        options.SecurityStampValidationInterval = TimeSpan.Zero; // Invalidar los tokens al momento de cerrar la sesión
    })
    
    • Además, para implementar funcionalidad adicional al cerrar la sesión, puedes suscribirte al evento `CookieSignedOut` del `CookieAuthenticationEvents` y limpiar cualquier token asociado con la cookie de autenticación:
    csharp
    services.ConfigureApplicationCookie(options =>
    {
        options.Events.OnSignedOut = context =>
        {
            // Limpiar cualquier token asociado con la cookie de autenticación
            // Ejemplo: eliminar el SecurityStamp
            var userManager = context.HttpContext.RequestServices.GetRequiredService>();
            var user = context.HttpContext.User;
            var userId = userManager.GetUserId(user);
            userManager.RemoveAuthenticationTokenAsync(user, "MyTokenProvider", "SecurityStamp");
    
            return Task.CompletedTask;
        };
    });
    

    Con estas configuraciones, la cookie de autenticación será invalidada en el servidor cuando se llame a SignInManager.SignOutAsync, y cualquier intento de usar la cookie después de cerrar la sesión no será válido.

    Espero que esta información te sea útil para solucionar tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 16:29 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para implementar el inicio de sesión del servidor en ASP.NET Core Identity con autenticación de cookies, puedes usar la siguiente estrategia:

    • Crea un reclamo personalizado: Crea un reclamo personalizado que almacene un identificador único para cada usuario, como un GUID. Este reclamo debe ser único para cada usuario y no debe cambiar después de que el usuario haya iniciado sesión.
    • Agrega el reclamo al objeto ClaimsIdentity: Cuando un usuario inicia sesión correctamente, agrega el reclamo personalizado al objeto ClaimsIdentity del usuario.
    • Almacena la información de autenticación en el servidor: Almacena el identificador único del reclamo personalizado y otra información de autenticación necesaria (como la fecha de caducidad) en una base de datos o caché del servidor. Esta información se utilizará para verificar la autenticación del usuario en solicitudes posteriores.
    • Verifica la autenticación del servidor: En las solicitudes posteriores, verifica si el identificador único del reclamo personalizado existe en la base de datos o caché del servidor. Si existe y la información de autenticación es válida, considera que el usuario está autenticado.
    • Invalida la información de autenticación del servidor: Cuando un usuario cierra la sesión, invalida la información de autenticación almacenada en el servidor asociada con el identificador único del reclamo personalizado. Esto garantiza que el usuario ya no pueda autenticarse mediante la cookie.

    De esta manera, incluso si la cookie se utiliza después de una señal de cierre de sesión, ya no será válida porque la información de autenticación en el servidor se habrá invalidado.

    Ejemplo de implementación:

    csharp
    public async Task SignIn(LoginViewModel model)
    {
        var user = await _userManager.FindByEmailAsync(model.Email);
        if (user != null)
        {
            var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
            identity.AddClaim(new Claim("CustomClaim", Guid.NewGuid().ToString()));
            await _signInManager.SignInAsync(user, identity);
            return RedirectToAction("Index");
        }
    
        return View(model);
    }
    
    public async Task SignOut()
    {
        await _signInManager.SignOutAsync();
        return RedirectToAction("Index");
    }
    
    [Authorize]
    public async Task Index()
    {
        var user = await _userManager.GetUserAsync(User);
        var customClaimValue = User.Claims.FirstOrDefault(c => c.Type == "CustomClaim")?.Value;
    
        // Verifica la autenticación del servidor utilizando el valor de reclamo personalizado
        var isValid = await _myService.IsValidAuthentication(customClaimValue);
    
        if (!isValid)
        {
            // La autenticación del servidor no es válida. Invalida la cookie.
            await _signInManager.SignOutAsync();
            return RedirectToAction("Index");
        }
    
        return View();
    }
    

    En este ejemplo, el reclamo personalizado se llama "CustomClaim" y su valor es un GUID único. La información de autenticación se almacena en el servidor utilizando un servicio personalizado llamado _myService. La acción Index verifica la autenticación del servidor y, si no es válida, invalida la cookie.

    Respondida el Dec 19, 2020 a las 16:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0