Файл cookie аутентификации ASP ASPXAUTH не очищается при входе / выходе - PullRequest
8 голосов
/ 08 декабря 2010

Я использую аутентификацию ASP и встроенный веб-сервис.

Пользователь входит в систему с помощью проверки подлинности с помощью форм на странице входа в систему.
Чтобы выйти из системы, я вызываю веб-службу аутентификации из Silverlight и вызываю из системы.

Все работает нормально, но теперь иногда IE получаетсумасшедший и больше не выходит из системы.

Я использовал Fiddler, и выясняется, что служба аутентификации возвращает SetCookie, чтобы очистить cookie ASPXAUTH, но при следующем вызове IE все еще имеет набор cookie.
Так что, конечно, потому что cookie там, пользователь проходит проверку подлинности и входит обратно, а не направляется на страницу входа.

Я проверил и не увидел никакого другого описания проблемы.Я не могу воспроизвести его, и мои коллеги, у которых неправильно работает IE, работают нормально в одной среде, а не в другой (у одной проблема с DEV, а у другой проблема с сервером PreProd).

Есть идеи, что может происходить?

Ответы [ 3 ]

4 голосов
/ 08 декабря 2010

У меня была эта проблема, и чтобы убедиться, что пользователь вышел из системы, теперь я использую следующий фрагмент кода:

        FormsAuthentication.SignOut();

        // Drop all the information held in the session
        Session.Clear();
        Session.Abandon();

        // clear authentication cookie
        HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
        cookie1.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie1);

        // clear session cookie
        HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
        cookie2.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie2);

        // Redirect the user to the login page
        Response.Redirect("YourLoginPage.aspx", true);
2 голосов
/ 08 декабря 2010

Чтобы избежать этой проблемы, в момент, когда вы делаете SignOut, следующий вызов должен быть с Redirect (pageLogOut, true );и прекратить любые другие действия до его полного перенаправления.Параметр true очень важен.

После вызова SignOut () вы должны принудительно заставить браузер сбрасывать данные cookie, потому что если при повторной аутентификации запрашивать cookie снова по какой-либо причине, то cookie получает больше времени для жизнии его нельзя удалить из браузера, как вы просите с помощью команды SigntOut.

Поэтому после SignOut сделайте перенаправление на страницу - или убедитесь, что вы сбрасываете куки в браузер и больше не спрашиваетевсе, что связано с аутентификацией пользователя, пока файлы cookie не будут полностью записаны в браузер.

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

0 голосов
/ 23 апреля 2015

Вероятно, проблема, с которой вы сталкивались, касалась домена 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...