ASP.NET аутентификация входа и выхода с помощью кнопки «Назад» браузера - PullRequest
29 голосов
/ 22 апреля 2010

Я ищу решение для пользователя, использующего кнопку назад браузера для перехода на предыдущую страницу после выхода из системы.

У меня есть веб-приложение, встроенное в asp.net и использующее пользовательский провайдер членства для аутентификации и авторизации. Все работает отлично, за исключением того, что когда пользователь нажимает на ссылку выхода из системы, чтобы выйти из приложения и перенаправляется на титульную страницу по умолчанию, если пользователь нажимает кнопку BACK BUTTON в своем браузере, он фактически возвращается туда, где он был раньше, данные все равно будут отображаться.

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

Мне просто интересно, есть ли какой-нибудь способ, которым я могу либо очистить историю браузера, чтобы пользователь не мог вернуться назад, либо когда они нажимают кнопку "Назад" и перенаправляют их на страницу входа.

спасибо

Ответы [ 7 ]

23 голосов
/ 22 апреля 2010

Беспокойство по поводу истории браузера и кнопки «Назад» вызовет головную боль и генитальные бородавки. Есть встроенные средства для решения этой проблемы.

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

[vb.net]

Imports System.Web.Security

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles MyBase.Load
    Session.Abandon()
    FormsAuthentication.SignOut()
End Sub

[C #]

using System.Web.Security;

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    Session.Abandon();
    FormsAuthentication.SignOut();
}

Код взят с этой страницы и действителен, но страница плохо смотрится.

Хороший вопрос / ответ относительно поведения кнопки можно найти здесь .

Обновление:

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

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

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

3 голосов
/ 22 апреля 2010

Вы можете использовать javascript, чтобы отключить кнопку «назад» (обычно, отправляя пользователя на страницу, которая перенаправляет на другую страницу, чтобы при нажатии кнопки «назад» вы снова пересылались). Постоянный пользователь все еще может вернуться на 2 шага назад к истории и перешагнуть через цикл.

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

1 голос
/ 10 декабря 2013

Ваш ответ

Чтобы обойти это, добавьте следующий код javascript в раздел страницы logout.aspx:

<script type="text/javascript">
 window.history.forward(1);
</script>

Этот код javascriptперенаправит пользователя назад, если пользователь попадет на страницу выхода, нажав кнопку «назад».

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

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
1 голос
/ 22 августа 2012

Этот код очень полезен

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Поместите этот код только в событие загрузки, в случае мастер-страницы, но он работает только для IE, для IE и Firefox я использовал

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
0 голосов
/ 09 июля 2018

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

PS: следующие коды являются компиляцией из различных источников.Разместите его здесь, чтобы любой, кто ищет решение, мог найти его полезным

Master.cs

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore(); 

    }

Master.aspx

<a href="logout.aspx">Logout</span></a>

logout.cs

protected void Timer1_Tick(object sender, EventArgs e)
        {
            Session.Clear();
            Session.Abandon();


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

        try
        {
            Session.Abandon();
            FormsAuthentication.SignOut();
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Buffer = true;
            Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
            Response.Expires = -1000;
            Response.CacheControl = "no-cache";
            //Response.Redirect("login.aspx", true);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        Response.Redirect("Signin.aspx");
    }

logout.aspx

<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Text="Loggin Out Please Wait" runat="server" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
            </asp:Timer>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

</div>
</form>
0 голосов
/ 08 декабря 2010

Вы можете попробовать использовать свойство HttpResponse.Cache, если это поможет:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
//…
}

Или может полностью блокировать кэширование страницы с помощью HttpResponse.CacheControl, но его использование не рекомендуется в пользу свойства Cache, указанного выше:

Response.CacheControl = “No-Cache”;

ИЛИ вы действительно можете сходить с ума и делать все вручную:

Response.ClearHeaders();
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1

Ссылка

0 голосов
/ 22 апреля 2010

На самом деле я нашел решение, я добавил следующий фрагмент к методу загрузки страницы главной страницы.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);

спасибо за ответ в любом случае:)

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