Достаточно банальная вещь, но я думаю, что этот вопрос часто всплывает :)
Попросили тут меня поглядеть один код.
Смысл такой, что FormsAuthentication.SignOut() не работало, хоть тресни, как не бейся, очищай куки, и т.д. и т.п.
Код был такой:
На логин:
// Параметры тикета особо не важны
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, login, DateTime.Now, DateTime.Now.AddHours(1), false, usrData);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContext.Current.Response.Cookies.Add(authCookie);
FormsAuthentication.RedirectFromLoginPage(login, false);
логаут:
FormsAuthentication.SignOut();
HttpContext.Current.Session.Abandon();
Наметанный глаз наверное уже бы вычислил, в чем дело, но я уже давно пользовался работающей компонентой, и благополучно забыл все эти ньюансы, так что мне в глаза ничего не бросилось. Сел смотреть чего происходит, включил трейс. Смотрю - две аутентификационные куки при логине получаются. Тут уже более менее все стало ясно - метод FormsAuthentication.RedirectFromLoginPage(login, false) пишет свою куку.
Ага, но как же нам отредиректиться. Вроде бы есть метод FormsAuthentication.GetRedirectUrl, но он в качестве параметра тоже принимает, писать ли перзистентную куку, или нет, т.е. по идее тоже пишет куку. Я подумал, что это как-то странно, и полез в рефлектор. Мысли насчет RedirectFromLoginPage были правильные:
// Метод с двумя параметрами получает CookiePath и обращается к этому.
public static void RedirectFromLoginPage(string userName, bool createPersistentCookie, string strCookiePath)
{
FormsAuthentication.Initialize();
if (userName != null)
{
// Вот где оно пишет куку
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie, strCookiePath);
// Таак, а это чего такое?? Оно что, еще куку перезаписывает?
HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, createPersistentCookie), false);
}
}
А вот мысли на счет GetRedirectUrl - не совсем:
public static string GetRedirectUrl(string userName, bool createPersistentCookie)
{
FormsAuthentication.Initialize();
if (userName == null)
{
return null;
}
HttpContext context1 = HttpContext.Current;
string text1 = context1.Request["ReturnUrl"];
if (text1 == null)
{
text1 = UrlPath.Combine(context1.Request.ApplicationPath, "default.aspx");
}
return text1;
}
Вы спросите - а зачем этому методу параметр createPersistentCookie? Да и даже если присмотреться, зачем тут параметр userName? Я вот тоже долго думал. Обещаю - при случае если узнаю у кого спрашивать - спрошу обязательно.
Конечно, замена FormsAuthentication.RedirectFromLoginPage(login, false) на HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, false)) полностью устранила проблему.
Будьте внимательнее, и главное - пользуйтесь рефлектором!!!