Как запретить вышедшему из системы пользователю возвращаться на предыдущую страницу с помощью кнопки «Назад» в asp.net?

Мое приложение asp .net сталкивается с проблемой, когда вышедшие из системы пользователи используют кнопку «Назад» браузера для повторного посещения ранее доступной страницы. Пользователь не может выполнять какие-либо события на стороне сервера, но было бы намного лучше, если бы пользователь вообще не имел права просматривать эту страницу. Я искал решение, чтобы остановить это, но большая часть решения включает в себя написание кода внутри страницы, который нельзя пересматривать, как этот.

 protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            string sb;
            sb = "<script language=javascript>\n";
            sb += "window.history.forward(1);\n";
            sb += "\n</script>";
            ClientScript.RegisterClientScriptBlock(Page.GetType(), "clientScript", sb);
        }

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


person Mridul Raj    schedule 26.01.2013    source источник
comment
Обновлен мой ответ на основе ваших комментариев   -  person Blachshma    schedule 26.01.2013


Ответы (3)


Основываясь на вашем вопросе, я понимаю, что вы хотите только запретить использование кнопки «Назад» (чтобы просмотреть предыдущие данные), но что ваша серверная часть работает правильно и не позволяет пользователям, выполнившим вход, выполнять какие-либо задачи. ..

Если это не так, вы также должны добавить проверку на стороне сервера, чтобы убедиться, что вышедший из системы пользователь (который должен рассматриваться как пользователь, который никогда не входил в систему) не может делать ничего, что требует разрешения...!

Возвращаясь к вашему вопросу - вы должны отключить кеширование в браузере.

В коде позади:

Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);

Вы также можете использовать теги META на странице ASPX:

 <META Http-Equiv="Pragma" Content="no-cache">
 <META Http-Equiv="Expires" Content="0">
 <META Http-Equiv="Cache-Control" Content="no-cache">

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

Если этого недостаточно, вы также можете использовать JavaScript для очистки истории, вот пример

Редактировать: И если вы хотите, чтобы этот код появлялся только один раз, вы можете создать BasePage (который является производным от Page), который имеет эту логику. Затем любая страница, на которой вы хотите использовать эту логику, должна быть получена из BasePage вместо обычного System.Web.UI.Page.

person Blachshma    schedule 26.01.2013

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

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

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

Для этого можно использовать метатеги. .NET может иметь другие способы сделать это.

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

person drone.ah    schedule 26.01.2013

с решением, упомянутым @Blachshma, вы также можете иметь переменную GET, содержащую отметку времени, когда страница была извлечена. Затем в событии Page_Load() вы можете проверить, была ли отметка времени такой же, как текущая отметка времени. Если это не так, вы обновляете или перенаправляете страницу (в вашем случае на страницу входа). Вот как это делает GMAIL IIRC.

Не забудьте поместить проверку времени внутри if(!IsPostBack) в событии Page_Load().

person Aniket Inge    schedule 26.01.2013
comment
Ankit, это решение требует размещения предоставленного кода на каждой странице, которую может посетить пользователь. Я могу добиться того же результата, используя пример, который я привел. Я ищу решение, которое потребует минимальных изменений. - person Mridul Raj; 26.01.2013
comment
вы все равно должны разместить такой код, потому что вы даете пользователю разрешение на просмотр страницы, только если он вошел в систему @MridulRaj - person Aniket Inge; 26.01.2013
comment
Интересно - что, если пользователь действительно повторно посещает страницу правильно - то есть не вышел из системы - например, если бы у меня был мастер ASP.Net и я мог переходить туда и обратно через Steps? - person EdSF; 26.01.2013
comment
он должен будет проверить, вышел ли пользователь из системы или нет, или отобразить свежий @EdSF - person Aniket Inge; 26.01.2013