Invalider L'Ancien Cookie De Session - ASP.Net L'Identité
une société externe a effectué quelques essais de pénétration sur le ASP.NET application MVC 5 sur laquelle je travaille.
une question qu'ils ont soulevée est décrite ci-dessous
un cookie lié à la gestion de session s'appelle AspNet.ApplicationCookie. Lorsqu'elle est saisie manuellement,l'application authentifie l'utilisateur. Même si l'utilisateur se déconnecte de l'Application,le cookie est toujours valide. Cela signifie,l'ancien cookie de session peut être utilisé pour une authentification valide dans illimité laps de temps. Au moment où l'ancienne valeur est insérée, l'application l'accepte et la remplace par un cookie nouvellement généré. Par conséquent, si l'attaquant accède à l'un des cookies existants,la session valide sera créée, avec le même accès que dans le passé.
nous utilisons ASP.NEt identité 2.2
voici notre action de déconnexion sur le contrôleur de Compte
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Login", "Account");
}
démarrage.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())))
}
});
j'aurais je pensais que le cadre aurait pris soin d'invalider un vieux cookie de session mais en parcourant L'Owin.Code source de sécurité apparemment non.
Comment puis-je invalider le cookie de session sur la déconnexion?
modifier Jamie Dunstan's des Conseils, j'ai ajouté AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
mais puis a fait aucune différence. Je peux encore me déconnecter de l'application, cloner une requête précédemment authentifiée dans Fiddler, et la faire accepter par le application.
Edit : Ma mise à jour de Fermeture de la méthode
[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");
}
2 réponses
assurez-vous d'utiliser AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie);
comme L'a correctement suggéré Jamie.
être capable de se connecter avec le même cookie est par conception. Identity ne crée pas de sessions internes pour suivre tous les utilisateurs connectés et si OWIN obtient un cookie qui frappe toutes les boîtes (c.-à-d. copies de la session précédente), il vous permettra de vous connecter.
si vous pouvez toujours vous connecter après la mise à jour du tampon de sécurité, très probablement OWIN ne peut pas mettre la main sur ApplicationUserManager
. Assurez-vous d'avoir cette ligne juste au-dessus de la app.UseCookieAuthentication
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Ou si vous utilisez DI prendre ApplicationUserManager
à partir de DI:
app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());
réduisez aussi le validateInterval: TimeSpan.FromMinutes(30)
de plus faible valeur - j'ai l'habitude de s'installer pour quelques minutes. C'est la fréquence à laquelle Identity compare les valeurs dans auth-cookie aux valeurs dans la base de données. Et lorsque la comparaison est faite, Identity régénère le cookie pour mettre à jour les horodateurs.
la réponse de Trailmax est évidente, j'ai pensé que je voudrais ajouter que si quelqu'un essaie de faire cela tout en utilisant aussi ASP.NET Boilerplate, voici ce que j'ai utilisé pour faire ce travail:
app.CreatePerOwinContext(() => IocManager.Instance.Resolve<UserManager>());
j'ai d'abord eu:
app.CreatePerOwinContext(() => IocManager.Instance.ResolveAsDisposable<UserManager>());
et ne fonctionnait pas.