FormsAuthentication.SignOut () не выходит из системы

Основной пример:

String fileName = "file.test";

BufferedOutputStream bs = null;

try {

    FileOutputStream fs = new FileOutputStream(new File(fileName));
    bs = new BufferedOutputStream(fs);
    bs.write(byte_array);
    bs.close();
    bs = null;

} catch (Exception e) {
    e.printStackTrace()
}

if (bs != null) try { bs.close(); } catch (Exception e) {}
139
задан GEOCHET 7 March 2009 в 05:46
поделиться

9 ответов

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

Вы должны изменить свой код на этот:

FormsAuthentication.SignOut();
Session.Abandon();

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

// clear session cookie (not necessary for your current problem but i would recommend you do it anyway)
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
HttpCookie cookie2 = new HttpCookie(sessionStateSection.CookieName, "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);

FormsAuthentication.RedirectToLoginPage();

HttpCookie находится в System.Web пространство имен. Ссылка MSDN .

201
ответ дан 23 November 2019 в 23:20
поделиться

Код, который Вы отправили, похож на него, должен правильно удалить аутентификационный маркер форм, таким образом, возможно, что рассматриваемые папки/страницы на самом деле не защищены.

Вы подтвердили, что к страницам нельзя получить доступ, прежде чем вход в систему произошел?

можно ли отправить web.config настройки и войти ли в систему код, который Вы используете?

3
ответ дан Abram Simon 7 March 2009 в 05:46
поделиться
  • 1
    Обратите внимание, что попытка оптимизировать этот материал, скорее всего, преждевременна. Если Вы, прежде всего, не воздействуете на огромные суммы булевых данных, они won' t быть причиной любых проблем памяти. – Anon. 22 February 2010 в 00:17

Вы тестируете/видите это поведение с помощью IE? Возможно, что IE подает те страницы от кэша. Известно трудно заставить IE сбрасывать, это - кэш, и так далее много случаев, даже после того, как Вы выходите из системы, введение URL одной из "защищенных" страниц показало бы кэшируемое содержание до.

(я видел это поведение, даже когда Вы регистрируетесь как различный пользователь, и IE показывает "Желанную" панель наверху Вашей страницы с именем пользователя старого пользователя. В наше время обычно перезагрузка будет обновлять его, но если это является персистентным, это могла бы все еще быть кэширующаяся проблема.)

0
ответ дан Stobor 7 March 2009 в 05:46
поделиться
  • 1
    Любым решением будет O (N). Доказательство оставляют как осуществление, подсказка: сколько элементов станд.:: набор может быть достигнут в постоянное время? – MSalters 16 June 2010 в 13:09

Звуки мне как Вы не имеют Вашего web.config раздела авторизации настроенным правильно в. Посмотрите ниже для примера.

<authentication mode="Forms">
  <forms name="MyCookie" loginUrl="Login.aspx" protection="All" timeout="90" slidingExpiration="true"></forms>
</authentication>
<authorization>
  <deny users="?" />
</authorization>
20
ответ дан jwalkerjr 7 March 2009 в 05:46
поделиться

Могло случиться так, что Вы входите в систему от одного субдомена (sub1.domain.com) и затем пытаетесь выйти из системы от другого субдомена (www.domain.com).

1
ответ дан jorsh1 7 March 2009 в 15:46
поделиться

Я писал базовый класс для всех своих страниц и столкнулся с той же проблемой. У меня был код, подобный следующему, и он не работал. Отслеживая, управление переходит от оператора RedirectToLoginPage () к следующей строке без перенаправления.

if (_requiresAuthentication)
{
    if (!User.Identity.IsAuthenticated)
        FormsAuthentication.RedirectToLoginPage();

    // check authorization for restricted pages only
    if (_isRestrictedPage) AuthorizePageAndButtons();
}

Я обнаружил, что есть два решения. Либо изменить FormsAuthentication.RedirectToLoginPage (); быть

if (!User.Identity.IsAuthenticated)
    Response.Redirect(FormsAuthentication.LoginUrl);

ИЛИ изменить web.config, добавив

<authorization>
  <deny users="?" />
</authorization>

Во втором случае во время трассировки элемент управления не достиг запрошенной страницы. Он был сразу же перенаправлен на URL входа в систему, прежде чем достигнуть точки останова. Следовательно, метод SignOut () не является проблемой, метод перенаправления - один.

Я надеюсь, что это может кому-то помочь

С уважением

3
ответ дан 23 November 2019 в 23:20
поделиться

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

Проблема, должно быть, заключалась в том, что страница перенаправлялась в неправильное время, следовательно, не запускалась аутентификация.

1
ответ дан 23 November 2019 в 23:20
поделиться

Ключевым моментом здесь является то, что вы говорите: «Если я ввожу URL-адрес напрямую ...».

По умолчанию при проверке подлинности с помощью форм браузер кеширует страницы для пользователя. Таким образом, выбрав URL-адрес непосредственно из раскрывающегося списка адресного окна браузера или введя его, МОЖЕТ получить страницу из кеша браузера и никогда не возвращаться на сервер для проверки аутентификации / авторизации. Решением этой проблемы является предотвращение кэширования на стороне клиента в событии Page_Load каждой страницы или в OnLoad () вашей базовой страницы:

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Вы также можете позвонить:

Response.Cache.SetNoStore();
12
ответ дан 23 November 2019 в 23:20
поделиться

Я тоже боролся с этим раньше.

Вот аналогия тому, что, кажется, происходит ... Новый посетитель, Джо, заходит на сайт и входит через страницу входа, используя FormsAuthentication. ASP.NET создает новую личность для Джо и передает ему файл cookie. Это печенье похоже на ключ от дома, и пока Джо возвращается с этим ключом, он может открыть замок. Каждому посетителю выдается новый ключ и новый замок.

Когда вызывается FormsAuthentication.SignOut () , система сообщает Джо, чтобы он потерял ключ. Обычно это работает, так как у Джо больше нет ключа, он не может войти.

Однако, если Джо когда-нибудь вернется, а действительно имеет этот потерянный ключ, его снова впустят!

Насколько я могу судить, нет никакого способа сказать ASP.NET сменить замок на двери!

Я могу жить с этим, запоминая имя Джо в переменной сеанса. Когда он выходит из системы, я выхожу из сеанса, поэтому у меня больше нет его имени. Позже, чтобы проверить, разрешен ли он, я просто сравниваю его Identity.Name с тем, что есть в текущем сеансе, и если они не совпадают, он не является действительным посетителем.

Короче говоря, для веб-сайта НЕ полагайтесь на User.Identity.IsAuthenticated без проверки переменных сеанса!

11
ответ дан 23 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: