IsPersistent nicht funktioniert - Cookie gilt nur für aktuelle Sitzung
Ich habe eine ASP.NET MVC 5
Anwendung mit ASP.NET Identity 2.1.0
für die Authentifizierung der Benutzer.
Alles hat gut funktioniert in der Vergangenheit, aber jetzt habe ich herausgefunden, dass anhaltende Benutzer-sessions nicht mehr funktionieren. Ich kann nicht sagen, welche Veränderung brach, aber es funktionierte, wenn ich umgesetzt Identität (konvertiert die Anwendung von SimpleMembership
) und dies ist meine Logik habe ich im moment:
var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password,
model.RememberMe, shouldLockout: true);
SignInManager
ist mein ApplicationSignInManager
basierend auf SignInManager<ApplicationUser, int>
und model.RememberMe
ist true
.
Und mein setup:
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity(
validateInterval: TimeSpan.FromMinutes(0),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
Alles funktioniert gut, außer die Persistenz des Benutzer-sessions. Ich habe die cookies zurückgegeben, die von meinem server und die .AspNet.ApplicationCookie
wird immer zurückgegeben "gültig für aktuelle Sitzung" statt ein Datum in der Zukunft. Wenn ich also schließen und wieder öffnen des Browsers muss ich wieder anmelden...
Hat jemand eine Idee, warum das so ist funktioniert nicht (mehr)?
P. S.: ich habe überschrieben SignInAsync
in meinem ApplicationSignInManager
weil ich einige eigene Logik gibt, aber ich selbst habe mit dem debugger, und für die folgenden nennen:
await base.SignInAsync(user, isPersistent, rememberBrowser);
isPersistent
ist true
, so sollte es schaffen, ein persistent cookie.
- Ich vermute
validateInterval: TimeSpan.FromMinutes(0)
verursachen kann. Da bei jeder Anfrage regeneriert cookie und setzt einen neuen ein. Versuchen SievalidateInterval
auf etwas mehr als 0 und sehen, ob das funktioniert. - Danke, das war es. War, dass Veränderungen, die mit V 2.1? Weil es auf jeden Fall funktionierte am Anfang (mit V 2.0). Jedenfalls: diesen Post als Antwort und ich werde es akzeptieren. Ich brauche jetzt Weg finden, um dieses, wie ich brauche (weil SSO), die Validierung auf jede Anfrage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein bekannter Fehler in der Identität und suchen auf diese Antwort es ist nicht sehr neu.
Als cookie regeneriert wird auf jede Anfrage, "IsPersisted" - flag ist nicht gesetzt, wenn, auch wenn es in der original-cookie.
Um dies zu umgehen, müssen Sie implementieren Ihre eigene version der cookie-validator, der die fahne als ist sollte.
Ich denke ich habe die Lösung für Sie, aber ich habe nicht kompiliert oder getestet - einfach nur eine Allgemeine Richtung, wo Sie gehen müssen. Sehen Sie diese gist für vollständige code.
Dies ist nur ein
SecurityStampValidator
code entnommen decompiler. Ich habe Hinzugefügt Linien 91-96. Grundsätzlich nehme ich "IsPersistent" - flag aus der vorigen cookie und fügen Sie es zu dem neuen cookie, wenn es erstellt wird. Das war nicht getan in der nicht-modifizierten version.Und dann in deine Auth.Config Sie:
Beachten Sie jedoch, dass, wenn die neue version raus ist, überprüfen Sie, ob dies wurde behoben, so dass Sie können entfernen das schmutzige beheben. Dieses Problem ist berichtet behoben werden, aber kurz nach v2.1 war aus.
ApplicationCookieIdentityValidator
in meinem code) habe ich nur benötigt, um Ihre änderungen gibt es auch -> funktioniert!using Microsoft.Owin.Security;
Zugriff auf dieAuthenticationProperties
geben, obwohlAktualisierung sowohl
AspNet.Identity.Core
undAspNet.Identity.Owin
auf 2.2.1 sollte dieses Problem beheben.Um einen user loggedin auf browser schließen, Mvc Indentity. Der code unten ist was für mich gearbeitet in Startup.Auth.cs-Klasse.