Mam dziwny problem z uwierzytelnianiem cookie Owin.
Kiedy uruchamiam, uwierzytelnianie serwera IIS działa doskonale w IE / Firefox i Chrome.
Zacząłem testować z uwierzytelnianiem i logować się na różnych platformach i napotkałem dziwny błąd. Sporadycznie framework / IIS Owin po prostu nie wysyła żadnych plików cookie do przeglądarek. Wpiszę nazwę użytkownika i hasło, które są poprawne, kod działa, ale żaden plik cookie nie jest w ogóle dostarczany do przeglądarki. Jeśli zrestartuję serwer, zacznie działać, to w pewnym momencie spróbuję się zalogować i ponownie pliki cookie przestają być dostarczane. Przechodzenie przez kod nic nie robi i nie powoduje żadnych błędów.
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);
}
}
}
});
W ramach procedury logowania mam następujący kod:
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);
Aktualizacja 1: Wygląda na to, że jedną z przyczyn problemu jest to, że dodając elementy do sesji, zaczynają się problemy. Session.Content["ABC"]= 123
Wydaje się, że dodanie czegoś prostego, na przykład, powoduje problem.
Oto co mogę zobaczyć: 1) (Chrome) Kiedy loguję się, otrzymuję identyfikator ASP.NET_SessionId + mój plik cookie uwierzytelniania. 2) Przechodzę do strony, która ustawia sesję. Zawartość ... 3) Otwórz nową przeglądarkę (Firefox) i spróbuj się zalogować, ale nie otrzymuje ona identyfikatora ASP.NET_SessionId ani pliku cookie uwierzytelniania 4) Podczas gdy pierwsza przeglądarka ma ASP.NET_SessionId i nadal działa. W chwili, gdy usuwam ten plik cookie, ma ten sam problem, co wszystkie inne przeglądarki, na których pracuję, na adresie IP (10.xxx) i localhost.
Aktualizacja 2: Wymuś utworzenie ASPNET_SessionId
pierwszego na mojej stronie login_load przed uwierzytelnieniem za pomocą OWIN.
1) zanim uwierzytelnię się w OWIN, tworzę losową Session.Content
wartość na mojej stronie logowania, aby uruchomić ASP.NET_SessionId 2) następnie uwierzytelniam się i wykonuję kolejne sesje 3) Inne przeglądarki wydają się teraz działać
To jest dziwne. Mogę tylko stwierdzić, że ma to coś wspólnego z ASP i OWIN myślącymi, że są w różnych domenach lub czymś w tym rodzaju.
Aktualizacja 3 - Dziwne zachowanie między nimi.
Zidentyfikowano dodatkowe dziwne zachowanie - limit czasu sesji Owin i ASP jest inny. Widzę, że moje sesje Owin są dłużej żywe niż moje sesje ASP dzięki jakimś mechanizmom. Tak więc podczas logowania: 1.) Mam sesję uwierzytelniania opartą na plikach cookie 2.) Ustawiłem kilka zmiennych sesji
Moje zmienne sesji (2) „umierają”, zanim zmienna sesji pliku cookie owin wymusza ponowne zalogowanie, co powoduje nieoczekiwane zachowanie w całej mojej aplikacji. (Osoba jest zalogowana, ale tak naprawdę nie jest zalogowana)
Zaktualizuj 3B
Po pewnym czasie zobaczyłem na stronie kilka komentarzy, w których stwierdzono, że limit czasu uwierzytelniania „formularzy” i limit czasu sesji muszą się zgadzać. Myślę, że normalnie te dwa są zsynchronizowane, ale z jakiegoś powodu nie są zsynchronizowane.
Podsumowanie obejść
1) Zawsze najpierw utwórz sesję przed uwierzytelnieniem. Zasadniczo utwórz sesję podczas uruchamiania aplikacjiSession["Workaround"] = 0;
2) [Eksperymentalne], jeśli utrzymujesz pliki cookie, upewnij się, że limit czasu / długość OWIN jest dłuższy niż sessionTimeout w pliku web.config (w testowaniu)