Ich habe ein seltsames Problem mit der Verwendung der Owin-Cookie-Authentifizierung.
Wenn ich meine IIS-Serverauthentifizierung starte, funktioniert sie unter IE / Firefox und Chrome einwandfrei.
Ich habe angefangen, einige Tests mit Authentifizierung durchzuführen und mich auf verschiedenen Plattformen anzumelden, und bin auf einen seltsamen Fehler gestoßen. Sporadisch sendet das Owin Framework / IIS einfach keine Cookies an die Browser. Ich werde einen Benutzernamen und ein Passwort eingeben, die korrekt sind. Der Code wird ausgeführt, aber es wird überhaupt kein Cookie an den Browser gesendet. Wenn ich den Server neu starte, funktioniert er. Irgendwann werde ich versuchen, mich anzumelden, und erneut werden keine Cookies mehr geliefert. Das Überschreiten des Codes bewirkt nichts und wirft keine Fehler auf.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
Und innerhalb meines Anmeldevorgangs habe ich den folgenden Code:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
Update 1: Es scheint, dass eine Ursache des Problems darin besteht, dass beim Hinzufügen von Elementen zur Sitzung die Probleme beginnen. Das Hinzufügen von etwas Einfachem wie Session.Content["ABC"]= 123
scheint das Problem zu schaffen.
Was ich erkennen kann, ist Folgendes: 1) (Chrome) Wenn ich mich anmelde, erhalte ich ASP.NET_SessionId + mein Authentifizierungscookie. 2) Ich gehe zu einer Seite, auf der eine Sitzung festgelegt wird. Inhalt ... 3) Öffnen Sie einen neuen Browser (Firefox) und versuchen Sie sich anzumelden. Es wird weder eine ASP.NET_SessionId empfangen noch ein Authentifizierungs-Cookie hat die ASP.NET_SessionId, die weiterhin funktioniert. Sobald ich dieses Cookie entferne, hat es das gleiche Problem wie alle anderen Browser, an denen ich an der IP-Adresse (10.xxx) und dem lokalen Host arbeite.
Update 2:ASPNET_SessionId
Erzwinge die Erstellung von zuerst auf meiner login_load-Seite vor der Authentifizierung mit OWIN.
1) Bevor ich mich bei OWIN authentifiziere, mache ich Session.Content
auf meiner Anmeldeseite einen zufälligen Wert, um die ASP.NET_SessionId zu starten. 2) Dann authentifiziere ich mich und führe weitere Sitzungen durch. 3) Andere Browser scheinen jetzt zu funktionieren
Das ist bizarr. Ich kann nur schlussfolgern, dass dies etwas mit ASP und OWIN zu tun hat, die glauben, dass sie sich in verschiedenen Bereichen befinden oder so ähnlich.
Update 3 - Seltsames Verhalten zwischen den beiden.
Zusätzliches seltsames Verhalten festgestellt - Timeout der Owin- und ASP-Sitzung ist unterschiedlich. Was ich sehe, ist, dass meine Owin-Sitzungen durch einen Mechanismus länger am Leben bleiben als meine ASP-Sitzungen. Also beim Anmelden: 1.) Ich habe eine Cookie-basierte Authentifizierungssitzung 2.) Ich habe einige Sitzungsvariablen festgelegt
Meine Sitzungsvariablen (2) "sterben", bevor die Sitzungsvariable owin cookie eine erneute Anmeldung erzwingt, was zu unerwartetem Verhalten in meiner gesamten Anwendung führt. (Person ist angemeldet, aber nicht wirklich angemeldet)
Update 3B
Nach einigem Graben sah ich einige Kommentare auf einer Seite, die besagten, dass das Zeitlimit für die "Formular" -Authentifizierung und das Sitzungszeitlimit übereinstimmen müssen. Ich denke normalerweise, dass die beiden synchron sind, aber aus irgendeinem Grund sind die beiden nicht synchron.
Zusammenfassung der Problemumgehungen
1) Erstellen Sie vor der Authentifizierung immer zuerst eine Sitzung. Erstellen Sie grundsätzlich eine Sitzung, wenn Sie die Anwendung startenSession["Workaround"] = 0;
2) [Experimentell] Wenn Sie Cookies beibehalten, stellen Sie sicher, dass Ihr OWIN-Zeitlimit / Ihre Länge länger ist als Ihr sessionTimeout in Ihrer web.config (beim Testen).