Кнопка выхода из системы IIS6 ASP.NET Basic Authentication - PullRequest
3 голосов
/ 05 марта 2009

У меня есть требование для явной кнопки выхода из системы для пользователей в веб-приложении ASP.NET. Я использую IIS6 с базовой аутентификацией (SSL). Я могу перенаправить на другую веб-страницу, но браузер поддерживает сеанс. Я погуглил и нашел способ сделать это, позволив активному элементу управления x связаться с IIS и завершить сеанс. Я нахожусь в ограниченной среде, которая не допускает аутентификацию форм, и активные элементы управления x также не запрещены. Кто-нибудь еще имел это требование и как вы справились с ним?

Хорошо, это то, чего я боялся. Я видел подобные ответы в сети, и я надеялся, что у кого-то будет способ сделать это. Спасибо за ваше время, хотя. Я думаю, что я могу использовать JavaScript, чтобы предотвратить кнопку "назад", как history.back ()

Ответы [ 4 ]

4 голосов
/ 24 марта 2010

Я боролся с этим сам в течение нескольких дней.

Использование IE 'document.execCommand('ClearAuthenticationCache');' не для всех - хороший вариант: 1) он сбрасывает все учетные данные, а это означает, что пользователь, например, также выйдет из своего gmail или любого другого веб-сайта, на котором он в настоящий момент прошел аутентификацию 2) это только IE;)

Я попытался использовать Session.Abandon () и затем перенаправить на свой Default.aspx. Одного этого недостаточно. Вам необходимо явно указать браузеру, что сделанный запрос не авторизован. Вы можете сделать это, используя что-то вроде:

response.StatusCode = 401;
response.Status = "401 Unauthorized";
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name");
resp.End();

Это приведет к следующему: пользователь нажимает кнопку выхода ==> он получит основное окно входа в систему. ОДНАКО: если он нажимает escape (диалоговое окно входа исчезает) и нажимает обновление, браузер автоматически отправляет учетные данные снова, заставляя пользователя войти в систему, хотя он может подумать, что он вышел из системы.

Хитрость для решения этой проблемы состоит в том, чтобы всегда выплевывать уникальное «царство» . Затем браузер НЕ отправляет учетные данные в случае, описанном выше. Я решил выплюнуть текущую дату и время.

response.StatusCode = 401;
response.Status = "401 Unauthorized";
string realm = "my application name";                
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now)));
resp.End();

Еще одна вещь, которую вам нужно сделать, это сказать браузеру не кэшировать страницу:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetNoStore();

Со всеми этими вещами это работает (для меня) в IE, но до сих пор я все еще не мог предотвратить вход Firefox в пользователя, когда пользователь сначала нажимает escape (скрывает основной диалог входа в систему), а затем обновить (F5) или кнопку возврата браузера.

2 голосов
/ 05 марта 2009

Метод Session.Abandon уничтожает все объекты, хранящиеся в объекте Session, и освобождает их ресурсы. Если вы не вызываете метод Abandon явно, сервер уничтожает эти объекты по истечении времени сеанса.

0 голосов
/ 02 февраля 2010

Это решение этой проблемы, которое работает в IE6 и выше.

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton>


<script>

    function logout()
    {
    document.execCommand("ClearAuthenticationCache",false);
    }
 </script>

Нашел это из http://msdn.microsoft.com/en-us/library/bb250510%28VS.85%29.aspx

Коротко о веб-команде Ваши учетные данные, пожалуйста

В: Джерри Б. пишет: «После того, как пользователь подтвердил и обработал свой запрос, я теперь хочу сделать его недействительным. Предполагая, что эта машина находится в открытой среде, где кто-нибудь может подойти и использовать ее, я хочу бросить новый вызов каждый раз, когда пользователь обращается к определенному модулю в сети. "

A: Это часто запрашиваемая функция команды Internet Explorer, и хорошие люди там дали нам способ сделать это в Internet Explorer 6.0 SP1. Все, что вам нужно сделать, это вызвать метод execCommand для документа, передав в качестве параметра команды ClearAuthenticationCache, например:

document.execCommand("ClearAuthenticationCache");

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

Я положил это на кнопку ссылки выхода из системы, и она работает в IE6 sp1 и выше:

OnClientClick="document.execCommand('ClearAuthenticationCache');"
0 голосов
/ 05 марта 2009

Вы пытались вызвать Session.Abandon в ответ на нажатие кнопки?

Редактировать

Казалось бы, это классическая проблема с кнопкой "Назад".

Вы мало что можете сделать с кнопкой возврата. Представьте, что пользователь только что открыл текущую страницу в новом окне, а затем нажал кнопку выхода из системы, эта страница появляется для выхода из системы, но это не повлияет сразу на содержимое другого окна.

Только когда они попытаются перемещаться где-то в этом окне, станет очевидно, что их сеанс пропал.

Во многих браузерах кнопка возврата реализована аналогичным (хотя и не идентичным) способом. Возвращение к предыдущей странице не обязательно является навигацией для точки зрения HTML / HTTP.

...