Вероятно, проблема, с которой вы сталкивались, касалась домена cookie.Файл cookie может быть записан в "." + FormsAuthentication.CookieDomain
.Ранее я установил файлы cookie для домена «admin.example.com» и увидел, что файл cookie добавлен с .
.В среде разработчика он записывается в localhost
. Решение, которое я использую, заключается в добавлении двух файлов cookie для каждого файла cookie аутентификации и файла cookie сеанса.
Таким образом, решение, которое я использую, заключается в следующемзатем:
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();
}
В результате этого вызова в ответ будут добавлены следующие заголовки
Расположение: /Login.aspx? ReturnUrl = Default.aspx
Set-Cookie: **** =;истекает = вт, 12 октября 1999 года, 05:00:00 по Гринвичу;Путь = /;HttpOnly
Set-Cookie: **** =;домен = admin.example.com;истекает = ср, 23 апреля 2014 г. 18:04:58 по Гринвичу;Путь = /;HttpOnly
Set-Cookie: **** =;домен = .admin.example.com;истекает = ср, 23 апреля 2014 г. 18:04:58 по Гринвичу;Путь = /;HttpOnly
Set-Cookie: ASP.NET_SessionId =;срок действия домена = admin.example.com истекает = среда, 23 апреля 2014 года, 18:04:58 по Гринвичу;Путь = /;HttpOnly
Set-Cookie: ASP.NET_SessionId =;срок действия домена = .admin.example.com истекает = ср., 23 апреля 2014 г., 18:04:58 по Гринвичу;Путь = /;HttpOnly
Где ***
- имя моего куки-файла, содержащего значение моего зашифрованного билета аутентификации;
Обратите внимание, что первый Set-Cookie
, вероятно, генерируется извызов метода FormsAuthentication.SignOut()
.