tutorial net mvc implement framework existing español asp asp.net-mvc asp.net-identity owin asp.net-identity-2

asp.net-mvc - mvc - implement identity asp net



Invalidar la cookie de sesión anterior-Identidad ASP.Net (2)

Una empresa externa ha realizado algunas pruebas de penetración en la aplicación ASP.NET MVC 5 en la que estoy trabajando.

Un problema que plantearon se describe a continuación.

Una cookie vinculada a la gestión de sesión se llama AspNet.ApplicationCookie. Cuando se ingresa manualmente, la aplicación autentica al usuario. Aunque el usuario cierre sesión en la Aplicación, la cookie sigue siendo válida. Esto significa que la cookie de sesión anterior se puede usar para una autenticación válida dentro de un período de tiempo ilimitado. En el momento en que se inserta el valor anterior, la aplicación lo acepta y lo reemplaza por una cookie recién generada. Por lo tanto, si el atacante obtiene acceso a una de las cookies existentes, se creará la sesión válida, con el mismo acceso que en el pasado.

Estamos usando ASP.NEt Identity 2.2

Aquí está nuestra acción de cierre de sesión en el controlador de cuenta

[HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { AuthenticationManager.SignOut(); return RedirectToAction("Login", "Account"); }

en startup.auth.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), ExpireTimeSpan = TimeSpan.FromHours(24.0), Provider = new CookieAuthenticationProvider { // Enables the application to validate the security stamp when the user logs in. // This is a security feature which is used when you change a password or add an external login to your account. OnValidateIdentity = SecurityStampValidator .OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>( validateInterval: TimeSpan.FromMinutes(1.0), regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager), getUserIdCallback: (id) => (Int32.Parse(id.GetUserId()))) } });

Pensé que el marco se habría ocupado de invalidar una cookie de sesión anterior, pero al buscar en el código fuente de Owin.Security no aparece.

¿Cómo invalido la cookie de sesión al cerrar sesión?

Edite el consejo de Jamie Dunstan . He añadido AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); Pero entonces no ha hecho ninguna diferencia. Todavía puedo desconectarme de la aplicación, clonar una solicitud previamente autenticada en Fiddler y hacer que la solicitud la acepte.

Editar: Mi método de cierre de sesión actualizado

[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> LogOff() { var user = await UserManager.FindByNameAsync(User.Identity.Name); AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); await UserManager.UpdateSecurityStampAsync(user.Id); return RedirectToAction("Login", "Account"); }


Asegúrese de utilizar AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie); como correctamente sugerido por Jamie.

Ser capaz de iniciar sesión con la misma cookie de nuevo es por diseño. La identidad no crea sesiones internas para rastrear a todos los usuarios registrados y si OWIN obtiene una cookie que llega a todas las casillas (es decir, copias de la sesión anterior), le permitirá iniciar sesión.

Si aún puede iniciar sesión después de que se actualice el sello de seguridad, lo más probable es que OWIN no pueda retener ApplicationUserManager . Asegúrese de tener esta línea justo encima de la app.UseCookieAuthentication

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

O si está utilizando DI, tome ApplicationUserManager de DI:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

También reduzca el valor de validateInterval: TimeSpan.FromMinutes(30) a un valor más bajo. Generalmente me conformo con un par de minutos. Esta es la frecuencia con la que Identity compara los valores de auth-cookie con los valores de la base de datos. Y cuando se realiza la comparación, Identity regenera la cookie para actualizar las marcas de tiempo.


La respuesta de Trailmax es acertada, pensé que agregaría que si alguien está tratando de hacer esto al mismo tiempo que usa ASP .NET Boilerplate , lo siguiente es lo que usé para hacer que esto funcione:

app.CreatePerOwinContext(() => IocManager.Instance.Resolve<UserManager>());

Originalmente tuve:

app.CreatePerOwinContext(() => IocManager.Instance.ResolveAsDisposable<UserManager>());

y no estaba funcionando.