2017-01-25 1 views
0

Ich habe eine Anforderung zu beseitigen mehrere aktive Sitzungen von erlaubt auf unserer Website.Wie verhindere ich mehrere aktive Sitzungen in ASP.NET Identity 2.2.1 ordnungsgemäß, ohne das Kennwortänderungsverhalten zu beeinflussen?

Es ist mein Verständnis, dass dies tun Sie den validateInterval Parameter der OnValidateIdentity Eigenschaft des CookieAuthenticationProvider wie unten manipulieren:

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)) 
    } 

Ich änderte den Standardwert von 30 Minuten bis 0 für die Prüfung und es funktioniert wie vorausgesehen. Wenn ich mich bei einem zweiten Browser anmelde, wird die nächste Aktion im ersten Browser auf die Anmeldeseite umgeleitet.

Ich erlaube Benutzern auch, ihr Kennwort zu ändern, wann immer sie wollen (nach dem Login). Wenn die validateInterval-Eigenschaft null ist, wird der Benutzer unmittelbar nach dem Senden einer Kennwortänderung abgemeldet. Sie melden sich dann mit dem neuen Passwort an und können die Seite wie gewohnt nutzen.

Wenn ich den validateInterval-Parameterwert auf 10 Sekunden ändere, kann der Benutzer die aktuelle Sitzung fortsetzen, nachdem er eine Kennwortänderung für 10 Sekunden gesendet und dann zur Anmeldeseite umgeleitet wurde. diese

Im Innern der Change Wirkung der ManageController Klasse des Standard-Code, der nach einer erfolgreichen Kennwortänderung führt, ist:

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 }); 
} 

Ich dachte, dass die Linie SignInManager.SignInAsync würde die Sitzung des Benutzers hält auch nicht durch ein Passwort gehen Änderung (von Logout User From all Browser When Password is changed), aber es scheint, zusätzlich durch den validateInterval Parameter kontrolliert zu werden.

Wenn ich einem Benutzer erlauben wollte, sein Kennwort während einer authentifizierten Sitzung zu ändern, ohne dass er sich erneut anmelden musste, konnte ich dies mit ASP.NET Identity tun und trotzdem mehrere aktive Sitzungen steuern? Gibt es eine bessere Möglichkeit, mehrere aktive Sitzungen zu steuern, ohne den Parameter validateInterval (von Prevent multiple logins) zu ändern?

Vielen Dank für Ihre Hilfe. Um zu verdeutlichen, ob dieses Verhalten beabsichtigt ist, geht es mir gut. Ich möchte nur verstehen, was vor sich geht, damit ich das Verhalten bei Bedarf meinem Chef verteidigen kann.

Edit:

scheiterte ich zu erwähnen, dass ich auch die Sicherheit Stempel in der Anmeldung im Anmelde über SignInManager das Vorzeichen direkt vor aktualisieren.

Antwort

0

Wenn Sie das tun, werden mehrere aktive Sitzungen nicht verhindert. Ich nehme auch an, dass es sich bei "Sitzungen" um mehrere Authentifizierungen desselben Benutzerkontos handelt. Mehrere aktive Sitzungen sind im wahrsten Sinne eine ganz andere Diskussion. Das heißt, der Cookie, der den "authentifizierten" Status des Benutzers erhält, ist mandantenabhängig. Wenn ich mich von meinem Desktop-Computer und von meinem Mobilgerät oder sogar von Chrome und Internet Explorer auf demselben Computer aus anmelde, handelt es sich dabei um unterschiedliche Cookies, die nicht von anderen Cookies beeinflusst werden, die möglicherweise auf anderen Geräten oder Browsern eingerichtet wurden.

Die einzige Möglichkeit, dies wirklich zu verhindern, ist, den Benutzer irgendwie als "eingeloggt" serverseitig zu markieren (d. H. Eine Spalte in Ihrer Benutzertabelle). Bevor Sie sie irgendwo anders authentifizieren (im Prinzip in Ihrer Post-Aktion), überprüfen Sie ihr Benutzerkonto auf dieses Flag. Wenn es bereits festgelegt ist, würden Sie sich weigern, sie erneut anzumelden, bis sie sich beim ursprünglichen Gerät/Browser abmelden.Offensichtlich müsste Ihre Abmeldeaktion diese Markierung dann aufheben, damit sie sich an anderer Stelle erneut anmelden können.

+0

Ich habe meinen ursprünglichen Beitrag bearbeitet. Ich habe einen zusätzlichen Schritt ausgelassen. Ich verwende Fiddler, um Anfragen an den ersten Browser erneut zu verteilen, nachdem ich mich in einen zweiten Browser eingeloggt habe, und bekomme jedes Mal eine Weiterleitung zu meiner Login-Seite. Wenn ich validateInterval auf etwas anderes als Null ändere, darf ich mehrere Authentifizierungen haben. – user2564788

+0

Wieder hat dieser Code nichts damit zu tun, was Sie erreichen wollen. Wenn Sie das Validierungsintervall auf Null setzen, wird die Anmeldefunktion überhaupt nicht ausgeführt, da alle Authentifizierungen sofort ungültig sind. Sie verhindern nicht mehrere Authentifizierungen. Sie verhindern * jegliche * Authentifizierung, die die Nebeneffekt hat, keine Mehrfachnennungen zuzulassen (d. h. 0 ist nie größer als 1). –

+0

Ich glaube, ich habe das Problem verwirrt. Ich führe dieses Setup derzeit in einer Testumgebung aus und habe kein Problem, sich zu authentifizieren oder authentifiziert zu bleiben. Erst wenn ich mein Passwort ändere, bin ich sofort ausgeloggt. Ich sehe jetzt, dass die UserManager-Methode ChangePasswordAsync einen neuen Sicherheitsstempel generiert (http://www.jamessturtevant.com/posts/ASPNET-Identity-Cookie-Authentication-Timeouts/). Das in Verbindung mit dem Validierungsintervall von Null bringt mich raus. Ich dachte, vielleicht könnte ich das verhindern, aber es scheint eingebaut zu sein. Danke für die Hilfe. – user2564788

Verwandte Themen