c# - framework - implement identity asp net
OWIN SignOut no elimina la cookie (4)
Estoy utilizando el middleware OWIN en un Servidor de autenticación externo al que mis aplicaciones se autentican usando el flujo de concesión de código de autorización OAuth.
Puedo redireccionar al Servidor de autenticación, autenticar contra un proveedor externo (Google) y redirigir nuevamente a mi aplicación cliente con un usuario registrado y la cookie de aplicación configurada correctamente, sin embargo, cuando intento cerrar la sesión, la cookie permanece después de llamar al AuthenticationManager.SignOut
método.
Mis opciones de cookies en Startup.Auth.cs
son:
var cookieOptions = new CookieAuthenticationOptions
{
Provider = cookieProvider,
AuthenticationType = "Application",
AuthenticationMode = AuthenticationMode.Passive,
LoginPath = new PathString("/Account/Index"),
LogoutPath = new PathString("/Account/Logout"),
SlidingExpiration = true,
ExpireTimeSpan = TimeSpan.FromMinutes(30),
};
app.UseCookieAuthentication(cookieOptions);
app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ExternalCookie);
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
Mi método de inicio de sesión:
var loginInfo = await AuthManager.GetExternalLoginInfoAsync();
SignInManager.ExternalSignInAsync(loginInfo, true);
var identity = AuthManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result.Identity;
if (identity != null)
{
AuthManager.SignIn(
new AuthenticationProperties {IsPersistent = true},
new ClaimsIdentity(identity.Claims, "Application", identity.NameClaimType, identity.RoleClaimType));
var ticket = AuthManager.AuthenticateAsync("Application").Result;
var identity = ticket != null ? ticket.Identity : null;
if (identity == null)
{
AuthManager.Challenge("Application");
return new HttpUnauthorizedResult();
}
identity = new ClaimsIdentity(identity.Claims, "Bearer", identity.NameClaimType, identity.RoleClaimType);
AuthManager.SignIn(identity);
}
return Redirect(Request.QueryString["ReturnUrl"]);
Método de cierre de sesión:
var authTypeNames = new List<string>();
authTypeNames.Add("Google");
authTypeNames.Add("Application");
authTypeNames.Add("Bearer");
authTypeNames.Add(DefaultAuthenticationTypes.ExternalCookie);
Request.GetOwinContext().Authentication.SignOut(authTypeNames.ToArray());
He examinado otras preguntas como: autenticación OWIN, caducidad del token actual y eliminación de cookies y OWIN - Autenticación.SignOut () no elimina las cookies
sin suerte Soy consciente de que podría eliminar manualmente la cookie al establecer una fecha de caducidad negativa, pero preferiría utilizar el método integrado si es posible.
¿Cómo consigo que la cookie de la aplicación se elimine cuando cierre sesión?
Si tiene alguna página maestra, por favor agregue la siguiente etiqueta. Puede ser que esto sería útil.
<meta http-equiv="Cache-control" content="no-cache" />
De otra respuesta de que funcionó para mí: OWIN - Authentication.SignOut () no parece eliminar la cookie
Use solo uno de estos:
Request.GetOwinContext().Authentication.SignOut();
Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
https://dzone.com/articles/catching-systemwebowin-cookie
Supondría que el segundo funcionaría para ti, pero parece que eso es lo que estás haciendo. ¿Puedes probar eso por sí mismo? Comenta tu matriz y confirma que eso funciona o no.
Para ser honesto, no sé lo suficiente sobre OWIN para saber sobre el modo de autenticación pasiva.
Para que el método SignOut marque el ticket de autenticación (cookie) que se eliminará del cliente, el parámetro AuthenticationType que pase al método SignOut y el valor en la cookie deben coincidir exactamente. Si desea eliminar más de un ticket de autenticación del cliente, tendrá que hacer coincidir TODOS esos tipos de autenticación y pasarlos como una cadena [] al método SignOut.
El Tipo de Autenticación de un ticket de autenticación usualmente tiene como prefijo el nombre del contenedor web del host (es decir, algo como ".AspNet") seguido de cualquier cosa con la que haya iniciado su configuración de autenticación de OWIN Cookie.
Parece que has establecido el valor de la cadena AuthenticationType en "Aplicación" en Startup.Auth.cs
. Intenta simplemente llamando:
Request.GetOwinContext().Authentication.SignOut("Application");
Si eso no funciona para usted, depuraría su aplicación y echaría un vistazo al AuthenticationType específico en la identidad para cada tipo de usuario autenticado que permita su aplicación, anote el valor del AuthenticationType para cada uno e intente incluirlos en una cadena [] en su llamada SignOut.
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
FormsAuthentication.SignOut();
Session.Abandon();