Gollum's den

ASP.NET (и не только) здесь и сейчас!

View Eugene Agafonov's profile on LinkedIn

December 2005 - Posts

FormsAuthentication.SignOut()

Достаточно банальная вещь, но я думаю, что этот вопрос часто всплывает :)

Попросили тут меня поглядеть один код.
Смысл такой, что 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)) полностью устранила проблему.

Будьте внимательнее, и главное - пользуйтесь рефлектором!!!

Posted: Dec 16 2005, 10:42 AM by Gollum | with 1 comment(s)
Filed under: ,