Ho uno strano problema con l'utilizzo dell'autenticazione con cookie Owin.
Quando avvio il mio server IIS l'autenticazione funziona perfettamente su IE / Firefox e Chrome.
Ho iniziato a fare alcuni test con autenticazione e accesso su piattaforme diverse e ho riscontrato uno strano errore. Sporadicamente il framework Owin / IIS non invia alcun cookie ai browser. Digiterò un nome utente e una password corretti per l'esecuzione del codice ma nessun cookie viene consegnato al browser. Se riavvio il server inizia a funzionare, ad un certo punto proverò ad accedere e di nuovo i cookie non verranno più consegnati. Il passaggio sul codice non fa nulla e non genera errori.
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);
}
}
}
});
E all'interno della mia procedura di accesso ho il seguente codice:
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);
Aggiornamento 1: sembra che una causa del problema sia quando aggiungo elementi alla sessione che iniziano i problemi. L'aggiunta di qualcosa di semplice come Session.Content["ABC"]= 123
sembra creare il problema.
Quello che posso capire è il seguente: 1) (Chrome) Quando accedo ottengo ASP.NET_SessionId + il mio cookie di autenticazione. 2) Vado a una pagina che imposta un session.contents ... 3) Apri un nuovo browser (Firefox) e prova ad accedere e non riceve un ASP.NET_SessionId né riceve un cookie di autenticazione 4) Mentre il primo browser ha ASP.NET_SessionId continua a funzionare. Nel momento in cui rimuovo questo cookie ha lo stesso problema di tutti gli altri browser su cui sto lavorando su indirizzo IP (10.xxx) e localhost.
Aggiornamento 2:ASPNET_SessionId
imponi la creazione della prima nella mia pagina login_load prima dell'autenticazione con OWIN.
1) prima di autenticarmi con OWIN faccio un casuale Session.Content
valore sulla mia pagina di accesso per avviare ASP.NET_SessionId 2) quindi autentico e faccio ulteriori sessioni 3) Altri browser sembrano ora funzionare
Questo è bizzarro. Posso solo concludere che ciò ha a che fare con ASP e OWIN pensando che si trovino in domini diversi o qualcosa del genere.
Aggiornamento 3 - Strano comportamento tra i due.
Ulteriore strano comportamento identificato: il timeout della sessione Owin e ASP è diverso. Quello che sto vedendo è che le mie sessioni Owin rimangono in vita più a lungo delle mie sessioni ASP attraverso un meccanismo. Quindi quando eseguo l'accesso: 1.) Ho una sessione di autenticazione basata su cucinata 2.) Ho impostato alcune variabili di sessione
Le variabili della mia sessione (2) "muoiono" prima che la variabile della sessione del cookie owin imponga di nuovo il login, causando comportamenti imprevisti in tutta la mia applicazione. (La persona è loggata ma non è realmente loggata)
Aggiornamento 3B
Dopo alcuni scavi ho visto alcuni commenti su una pagina che affermano che il timeout di autenticazione dei "moduli" e il timeout della sessione devono corrispondere. Penso normalmente che i due siano sincronizzati, ma per qualsiasi motivo i due non sono sincronizzati.
Riepilogo delle soluzioni alternative
1) Crea sempre una sessione prima dell'autenticazione. Fondamentalmente creare una sessione quando si avvia l'applicazioneSession["Workaround"] = 0;
2) [Sperimentale] se si persistono i cookie assicurarsi che il timeout / lunghezza OWIN sia più lungo della sessioneTimeout nel web.config (in fase di test)