J'ai une obligation d'éliminer plusieurs sessions actives d'être autorisés sur notre site.Comment empêcher correctement plusieurs sessions actives dans ASP.NET Identity 2.2.1 sans affecter le comportement de changement de mot de passe?
Je crois comprendre que, pour ce faire, vous pouvez manipuler le paramètre validateInterval de la propriété OnValidateIdentity du CookieAuthenticationProvider comme ci-dessous:
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>(
validateInterval: TimeSpan.FromMinutes(0), //Changed from default of 30 minutes
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
J'ai changé la valeur par défaut de 30 minutes à 0 pour les essais et il fonctionne comme anticipé. Si je me connecte à un deuxième navigateur, l'action suivante dans le premier navigateur me redirige vers la page de connexion.
Je permets également aux utilisateurs de changer leur mot de passe quand ils veulent (après la connexion). Avec la propriété validateInterval à zéro, l'utilisateur est déconnecté immédiatement après avoir soumis un changement de mot de passe. Ils se connectent ensuite avec le nouveau mot de passe et peuvent utiliser le site normalement. Si je change la valeur du paramètre validateInterval en 10 secondes, l'utilisateur est autorisé à continuer la session en cours après avoir soumis un changement de mot de passe pendant 10 secondes, puis est redirigé vers la page de connexion.
Dans l'action ChangePassword de la classe ManageController le code par défaut qui court après un changement de mot de passe avec succès est la suivante:
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
}
Je pensais que la ligne SignInManager.SignInAsync garderait la session de l'utilisateur allant même par un mot de passe change (à partir de Logout User From all Browser When Password is changed), mais il semble être contrôlé en plus par le paramètre validateInterval.
Si je voulais permettre à un utilisateur de changer son mot de passe pendant une session authentifiée sans forcer puis de se connecter à nouveau, est-ce que je pourrais le faire avec ASP.NET Identity et contrôler plusieurs sessions actives? Existe-t-il un meilleur moyen de contrôler plusieurs sessions actives sans modifier le paramètre validateInterval (à partir de Prevent multiple logins)?
Nous vous remercions de votre aide. Pour clarifier, si ce comportement est voulu, je vais bien. Je veux juste comprendre ce qui se passe afin que je puisse défendre le comportement à mon patron si nécessaire.
Edit:
J'omis de mentionner que je mets à jour aussi le timbre de sécurité directement avant le signe via SignInManager dans l'action de connexion.
J'ai modifié mon message original. J'ai omis un pas supplémentaire que je prends. J'utilise Fiddler pour relancer les demandes au premier navigateur après m'être connecté à un deuxième navigateur et obtenir une redirection vers ma page de connexion à chaque fois. Si je change validateInterval à autre chose que zéro, je suis autorisé à avoir plusieurs authentifications. – user2564788
Encore une fois, ce code n'a rien à voir avec ce que vous essayez d'accomplir. La mise à zéro de l'intervalle de validation empêche la connexion, car toutes les authentifications sont immédiatement invalides. Vous n'empêchez pas plusieurs authentifications; vous empêchez * toute * authentification, ce qui a pour effet de ne pas autoriser plusieurs (c'est-à-dire que 0 n'est jamais supérieur à 1). –
Je suppose que j'ai confondu le problème. J'utilise actuellement cette configuration dans un environnement de test et je n'ai aucun problème à m'authentifier ou à rester authentifié. Ce n'est que lorsque je change de mot de passe que je suis immédiatement déconnecté. Je vois maintenant que la méthode UserManager ChangePasswordAsync génère un nouveau cachet de sécurité (http://www.jamessturtevant.com/posts/ASPNET-Identity-Cookie-Authentication-Timeouts/). Cela en conjonction avec la validation de l'intervalle de zéro me met à la porte. J'ai pensé que je pourrais peut-être empêcher cela, mais cela semble être intégré. Merci pour l'aide. – user2564788