FormsAuthentication.SignOut не работает с файлом cookie собственного домена - PullRequest
9 голосов
/ 18 октября 2011

Заголовок должен сказать все это.

Вот код для установки cookie:

// snip - some other code to create custom ticket
var httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encodedTicket);
httpCookie.Domain = "mysite.com";
httpContextBase.Response.Cookies.Add(httpCookie);

Вот мой код для выхода из моего сайта:

FormsAuthentication.SignOut();

Среда :

Поэтому, когда я пытаюсь выйти из системы, файл cookie все еще там. Еслия избавляюсь от строки httpCookie.Domain (например, по умолчанию null), она отлично работает.

Еще одна странная вещь, которую я заметил, это то, что когда я задаю домен, Chrome не показывает мой cookie в части ресурсовинструментов разработчика, но когда я не устанавливаю домен, он делает.

И, во-вторых, когда я на самом деле создаю cookie с пользовательским доменом, при следующем запросе, когда я читаю вcookie из запроса (для его расшифровки), cookie есть, но домен пуст?xpiry до вчерашнего дня.Никаких кубиков.

Что происходит?Кто-нибудь может помочь?

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Я полагаю, что если вы установите атрибут domain для элемента forms в вашем файле web.config, такой же, как и в вашем файле cookie, он должен работать. ( EDIT: этот подход не будет работать, потому что метод SignOut в FormsAuthentication устанавливает другие флаги в cookie, которыми вы не являетесь, например HttpOnly) Метод SignOut в основном просто устанавливает дату истечения срока действия куки в 1999, и ему нужен домен, чтобы установить правильный файл cookie.

Если вы не можете жестко закодировать домен, вы можете применить свой собственный метод выхода:

private static void SignOut()
{
    var myCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
    myCookie.Domain = "mysite.com";
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    HttpContext.Current.Response.Cookies.Add(myCookie);
}

Файл cookie для аутентификации - это просто файл cookie; поэтому вы удалите его так же, как и любой другой файл cookie: истечет срок его действия и станет недействительным .

0 голосов
/ 10 декабря 2011

У меня была похожая проблема. В моем случае я сохранял некоторые userData в AuthCookie и испытывал те же эффекты, что и описанные выше, и при проверке подлинности при каждом запросе читал cookie и помещал userData в статическую переменную. В моем случае оказалось, что данные сохраняются в приложении. Чтобы обойти это, я должен был сначала очистить свою статическую переменную, а затем истек срок действия cookie. Я использовал следующее в методе LogOff моего AccountController:

AuthCookie.Clear(); //STATIC CLASS holding my userdata implemented by me.
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
Response.Cookies[FormsAuthentication.FormsCookieName].Value = null;
return RedirectToAction("Index", "Home");

Надеюсь, это поможет.

UPDATE

На догадке после отправки я заменил две средние строки на:

FormsAuthentication.SignOut();

... и он работал нормально там, где раньше.

Примечание:

AuthCookie.Clear();

... не касается AuthCookie, он просто сбрасывает статический класс, который я написал, в значения по умолчанию.

Опять же, надеюсь, это поможет.

...