Слишком долго разбивал мою голову от этого. Как запретить пользователю просматривать страницы сайта после того, как они вышли из системы с помощью FormsAuthentication.SignOut? Я ожидаю, что это сделать это:
FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
Но это не так. Если я введу URL-адрес напрямую, я все равно смогу перейти на страницу. Я давно не пользуюсь защитой по собственной инициативе, поэтому я забываю, почему это не работает.
asp.net
forms-authentication
Джейсон
источник
источник
Ответы:
Пользователи по-прежнему могут просматривать ваш веб-сайт, потому что куки не очищаются при вашем звонке,
FormsAuthentication.SignOut()
и они аутентифицируются при каждом новом запросе. В документации MS написано, что cookie будет очищен, но это не так, ошибка? Это точно так же, какSession.Abandon()
cookie все еще там.Вы должны изменить свой код на это:
HttpCookie
находится вSystem.Web
пространстве имен. Справочник MSDN .источник
Использование двух из приведенных выше сообщений x64igor и Phil Haselden решило это:
1. x64igor привел пример для выхода из системы:
Сначала вам нужно очистить куки-файлы аутентификации и куки- файлы сеанса , передав обратно пустые куки-файлы в ответе на выход из системы.
2. Фил Хаселден привел приведенный выше пример того, как предотвратить кэширование после выхода из системы:
Вам необходимо аннулировать кэш на стороне клиента через ответ .
источник
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); HttpCookie sessionCookie = new HttpCookie(sessionStateSection.CookieName, "");
. Как правило, имя файла cookie сеанса отсутствует"ASP.NET_SessionId"
.Похоже, у вас не правильно настроен раздел авторизации web.config. Смотрите ниже пример.
источник
Ключевым моментом здесь является то, что вы говорите: «Если я введу URL-адрес напрямую ...».
По умолчанию при проверке подлинности форм браузер кэширует страницы для пользователя. Таким образом, выбрав URL-адрес непосредственно из раскрывающегося списка адресов браузера или введя его, МОЖЕТ получить страницу из кэша браузера и никогда не возвращаться на сервер для проверки подлинности / авторизации. Решение этой проблемы состоит в том, чтобы предотвратить кэширование на стороне клиента в событии Page_Load каждой страницы или в OnLoad () вашей базовой страницы:
Вы также можете позвонить:
источник
Я тоже боролся с этим раньше.
Вот аналогия с тем, что, кажется, происходит ... Новый посетитель, Джо, заходит на сайт и входит через страницу входа в систему с помощью FormsAuthentication. ASP.NET генерирует новую личность для Джо и дает ему cookie. Это печенье похоже на ключ от дома, и пока Джо возвращается с этим ключом, он может открыть замок. Каждому посетителю предоставляется новый ключ и новый замок для использования.
Когда
FormsAuthentication.SignOut()
вызывается, система говорит Джо потерять ключ. Обычно это работает, так как у Джо больше нет ключа, он не может войти.Однако, если Джо когда-нибудь вернется и у него будет этот потерянный ключ, его снова впустят!
Из того, что я могу сказать, нет способа заставить ASP.NET изменить замок на двери!
Я могу жить с этим, вспоминая имя Джо в переменной Session. Когда он выходит из системы, я покидаю сессию, поэтому у меня больше нет его имени. Позже, чтобы проверить, разрешен ли ему вход, я просто сравниваю его Identity.Name с тем, что имеет текущий сеанс, и если они не совпадают, он не является действительным посетителем.
Короче говоря, для веб-сайта НЕ полагайтесь
User.Identity.IsAuthenticated
без проверки ваших переменных сеанса!источник
После долгих поисков, наконец, это сработало для меня. Я надеюсь, что это помогает.
источник
Это работает для меня
источник
Выложенный код выглядит так, как будто он должен корректно удалить токен проверки подлинности форм, поэтому вполне возможно, что рассматриваемые папки / страницы фактически не защищены.
Подтвердили ли вы, что доступ к страницам невозможен до того, как произойдет вход в систему?
Можете ли вы опубликовать настройки web.config и код входа, который вы используете?
источник
Я писал базовый класс для всех своих страниц, и я пришел к той же проблеме. У меня был код, подобный следующему, и он не работал. При трассировке управление переходит от оператора RedirectToLoginPage () к следующей строке без перенаправления.
Я узнал, что есть два решения. Либо изменить FormsAuthentication.RedirectToLoginPage (); быть
ИЛИ изменить web.config, добавив
Во втором случае при отслеживании управление не достигло запрошенной страницы. Он был сразу же перенаправлен на URL входа в систему, прежде чем достигнуть точки останова. Следовательно, метод SignOut () не проблема, а метод перенаправления.
Я надеюсь, что это может помочь кому-то
С уважением
источник
Я только что попробовал некоторые из предложенных здесь советов, и, хотя я смог использовать кнопку «Назад» в браузере, когда я щелкнул по выбору меню, токен [Authorize] для этого [ActionResult] вернул меня обратно на экран входа в систему.
Вот мой код выхода из системы:
Хотя функция возврата в браузере вернула меня назад и отобразила защищенное меню (я все еще над этим работаю), я не смог сделать ничего, что было защищено в приложении.
Надеюсь это поможет
источник
<deny users="?" />
в web.config)Я пробовал большинство ответов в этой теме, не повезло. Закончилось этим:
Нашел здесь: http://forums.asp.net/t/1306526.aspx/1
источник
Этот ответ технически идентичен Хосро.Пакманеш. Я публикую его, чтобы уточнить, чем его ответ отличается от других ответов в этой теме, и в каком случае его можно использовать.
В общем, очистить пользовательский сеанс, делая
эффективно выйдет из системы Однако , если в том же запросе вам нужно проверить
Request.isAuthenticated
(как это часто бывает в фильтре авторизации, например), вы обнаружите, чтодаже после того, как вы сделали
HttpContext.Session.Abandon()
иFormsAuthentication.SignOut()
.Единственное, что работало, делало
Это эффективно устанавливает
Request.isAuthenticated = false
.источник
Это начало происходить со мной, когда я установил свойство аутентификации> формы> Путь в
Web.config
. Удаление, котороеFormsAuthentication.SignOut();
устранило проблему, и простое снова удалило cookie.источник
Возможно, вы входите из одного субдомена (sub1.domain.com), а затем пытаетесь выйти из другого субдомена (www.domain.com).
источник
У меня была та же проблема, когда SignOut (), похоже, не смог правильно удалить тикет. Но только в конкретном случае, когда какая-то другая логика вызвала перенаправление. После того, как я удалил этот второй редирект (заменил его сообщением об ошибке), проблема ушла.
Проблема, должно быть, заключалась в том, что страница перенаправлялась в неправильное время, следовательно, не запускала аутентификацию.
источник
У меня сейчас похожая проблема, и я считаю, что проблема в моем случае, как и в оригинальном постере, связана с перенаправлением. По умолчанию Response.Redirect вызывает исключение, которое немедленно всплывает, пока не будет перехвачено, и перенаправление немедленно выполнено, я предполагаю, что это предотвращает передачу измененной коллекции файлов cookie клиенту. Если вы измените свой код для использования:
Это предотвращает исключение и, по-видимому, позволяет правильно отправлять cookie клиенту.
источник
Просто попробуйте отправить переменную сеанса, когда вы нажимаете «войти». И на странице приветствия сначала проверьте, пуст ли этот сеанс, например, при загрузке страницы или в событии Init:
источник
Для меня работает следующий подход. Я думаю, что если после оператора «FormsAuthentication.SignOut ()» возникнет ошибка, SingOut не будет работать.
источник
Вы тестируете / видите это поведение с помощью IE? Вполне возможно, что IE обслуживает эти страницы из кэша. Общеизвестно, что IE трудно очистить кэш, и во многих случаях, даже после выхода из системы, при вводе URL-адреса одной из «защищенных» страниц показывалось кэшированное содержимое ранее.
(Я видел такое поведение, даже когда вы входите в систему как другой пользователь, и IE отображает строку «Добро пожаловать» в верхней части вашей страницы со старым именем пользователя. В настоящее время обычно перезагрузка обновляет его, но если он сохраняется , это все еще может быть проблемой кеширования.)
источник
Выполнение Session.abandon () и уничтожение cookie-файлов работает довольно хорошо. Я использую mvc3 и похоже, что проблема возникает, если вы заходите на защищенную страницу, выходите из системы и просматриваете историю браузера. Ничего страшного, но все равно раздражает.
Попытка пролистать ссылки в моем веб-приложении работает правильно, хотя.
Возможно, стоит отключить кеширование в браузере.
источник
Для MVC это работает для меня:
источник
Я хотел добавить некоторую информацию, чтобы помочь понять проблему. Проверка подлинности с помощью форм позволяет хранить пользовательские данные либо в файле cookie, либо в строке запроса URL-адреса. Метод, поддерживаемый вашим сайтом, можно настроить в файле web.config.
По словам Microsoft :
В то же время они говорят :
Наконец, что касается UseDeviceProfile, они говорят :
Соединяя все это вместе, в зависимости от браузера пользователя, конфигурация по умолчанию может привести к тому, что CookiesSupported будет true , что означает, что метод SignOut не удаляет билет из куки. Это кажется нелогичным, и я не знаю, почему это работает так - я бы ожидал, что SignOut действительно выписывает пользователя при любых обстоятельствах.
Один из способов заставить SignOut работать самостоятельно - изменить режим файлов cookie на «UseCookies» (т. Е. Файлы cookie требуются) в файле web.config:
Согласно моим тестам, выполнение этого заставляет SignOut работать само по себе за счет вашего сайта, требующего, чтобы файлы cookie функционировали должным образом.
источник
Имейте в виду, что WIF отказывается указывать браузеру очистить файлы cookie, если сообщение wsignoutcleanup от STS не соответствует URL-адресу с именем приложения из IIS, и я имею в виду CASE SENSITIVE . WIF отвечает зеленой проверкой OK, но не отправляет команду на удаление куки в браузер.
Итак, вам нужно обратить внимание на чувствительность к регистру ваших URL.
Например, ThinkTecture Identity Server сохраняет URL-адреса посещающих RP в одном файле cookie, но делает их все строчными. WIF получит сообщение wsignoutcleanup в нижнем регистре и сравнит его с именем приложения в IIS. Если он не совпадает, он не удаляет куки, но сообщит браузеру «ОК». Итак, для этого Identity Server мне нужно было написать все URL-адреса в web.config и имена всех приложений в IIS в нижнем регистре, чтобы избежать таких проблем.
Также не забудьте разрешить сторонние куки в браузере, если у вас есть приложения за пределами поддоменов STS, иначе браузер не удалит куки, даже если WIF скажет ему об этом.
источник