Es probable que el problema que eras experiencia fue en lo que respecta al dominio de las cookies . La cookie puede escribirse en "." + FormsAuthentication.CookieDomain
. He configurado cookies para el dominio "admin.example.com" anteriormente, y he visto la cookie antepuesta con .
. En el entorno de desarrollo, está escrito en localhost
La solución que uso es agregar dos cookies para cada cookie de autenticación y sesión.
Así que la solución que estoy usando es como sigue:
protected void SignOut(HttpContext Context)
{
FormsAuthentication.SignOut();
Context.Session.Abandon();
// clear authentication cookie
Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName)
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName)
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
// clear session cookie (not necessary for the current problem but recommended anyway)
Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId")
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId")
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
FormsAuthentication.RedirectToLoginPage();
}
El resultado de esta convocatoria se sumarán los siguientes encabezados en la respuesta
Ubicación: /Login.aspx? ReturnUrl = Predeterminado.aspx
Set-Cookie: **** =; vence = martes, 12 de octubre de 1999 a las 05:00:00 GMT; ruta = /; HttpOnly
Set-Cookie: **** =; domain = admin.example.com; expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly
Set-Cookie: **** =; domain = .admin.example.com; expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly
Set-Cookie: ASP.NET_SessionId =; domain = admin.example.com expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly
Set-Cookie: ASP.NET_SessionId =; domain = .admin.example.com expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly
Dónde ***
es el nombre de mi galleta que contiene el valor de mi vale de autenticación cifrada;
Tenga en cuenta que la primera Set-Cookie
es probable generan a partir de la llamada FormsAuthentication.SignOut()
método.
Un problema común es que la cookie se establece en un contexto e intenta ser eliminada de otra. P.ej. asegúrese de que los atributos de ruta y dominio en el encabezado de eliminación de Set-Cookie coincidan exactamente con los de la llamada de Set-Cookie original. – EricLaw
Desafortunadamente, como dije, no tengo control sobre eso. Llamo a FormsAuthentication.RedirectFromLogin para configurar la cookie y llamar al método LogOut del servicio web. – R4cOON