Tengo un problema extraño con el uso de la autenticación de cookies Owin.
Cuando inicio mi autenticación del servidor IIS funciona perfectamente bien en IE / Firefox y Chrome.
Comencé a hacer algunas pruebas con autenticación e iniciar sesión en diferentes plataformas y se me ocurrió un error extraño. Esporádicamente, el framework Owin / IIS simplemente no envía ninguna cookie a los navegadores. Escribiré un nombre de usuario y una contraseña que es correcta, el código se ejecuta pero no se envía ninguna cookie al navegador. Si reinicio el servidor, comienza a funcionar, en algún momento intentaré iniciar sesión y nuevamente las cookies dejarán de entregarse. Pasar por encima del código no hace nada y no arroja errores.
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);
}
}
}
});
Y dentro de mi procedimiento de inicio de sesión tengo el siguiente código:
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);
Actualización 1: Parece que una de las causas del problema es que cuando agrego elementos a la sesión comienzan los problemas. Agregar algo simple como Session.Content["ABC"]= 123
parece crear el problema.
Lo que puedo ver es lo siguiente: 1) (Chrome) Cuando inicio sesión, obtengo ASP.NET_SessionId + mi cookie de autenticación. 2) Voy a una página que establece una sesión. Contenido ... 3) Abra un nuevo navegador (Firefox) e intente iniciar sesión y no recibe un ASP.NET_SessionId ni recibe una Cookie de autenticación 4) Mientras que el primer navegador tiene ASP.NET_SessionId y continúa funcionando. En el momento en que elimino esta cookie, tiene el mismo problema que todos los demás navegadores en los que estoy trabajando en la dirección IP (10.xxx) y localhost.
Actualización 2: Forzar la creación de ASPNET_SessionId
primero en mi página login_load antes de la autenticación con OWIN.
1) antes de autenticarme con OWIN hago un Session.Content
valor aleatorio en mi página de inicio de sesión para iniciar ASP.NET_SessionId 2) luego me autentico y realizo más sesiones 3) Parece que ahora otros navegadores funcionan
Esto es extraño Solo puedo concluir que esto tiene algo que ver con ASP y OWIN pensando que están en diferentes dominios o algo así.
Actualización 3 - Comportamiento extraño entre los dos.
Comportamiento extraño adicional identificado: el tiempo de espera de Owin y la sesión ASP es diferente. Lo que estoy viendo es que mis sesiones Owin se mantienen vivas más tiempo que mis sesiones ASP a través de algún mecanismo. Entonces, al iniciar sesión: 1.) Tengo una sesión de autenticación basada en cocina 2.) Establezco algunas variables de sesión
Mis variables de sesión (2) "mueren" antes de que la variable de sesión de cookie owin fuerce el reinicio de sesión, lo que provoca un comportamiento inesperado en toda mi aplicación. (La persona ha iniciado sesión pero realmente no ha iniciado sesión)
Actualización 3B
Después de investigar un poco, vi algunos comentarios en una página que dicen que el tiempo de espera de autenticación de "formularios" y el tiempo de espera de la sesión deben coincidir. Estoy pensando que normalmente los dos están sincronizados, pero por alguna razón los dos no están sincronizados.
Resumen de soluciones alternativas
1) Siempre cree una sesión primero antes de la autenticación. Básicamente crea una sesión cuando inicias la aplicaciónSession["Workaround"] = 0;
2) [Experimental] si persiste las cookies, asegúrese de que su tiempo de espera / duración OWIN sea más largo que su sesión Tiempo de espera en su web.config (en prueba)