Вход в систему и выход из системы с проверкой подлинности ASP.NET с помощью кнопки возврата в браузере

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

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

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

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

Благодарность


person Eatdoku    schedule 21.04.2010    source источник
comment
+1 за хороший вопрос. +1 за хороший вопрос чуть-чуть побил -1 за плохой вывод.   -  person Sky Sanders    schedule 22.04.2010
comment
это было из-за моей лени ~ попробую еще раз   -  person Eatdoku    schedule 22.04.2010


Ответы (7)


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

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

[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();

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

person Sky Sanders    schedule 21.04.2010
comment
Это не ответ на этот вопрос. - person nima; 29.11.2011
comment
Будет ли это отключать кеширование css / js? Спасибо: D - person Randel Ramirez; 27.01.2013
comment
@Sky Sanders - Погодите, разве вы не сказали кому-то в ответе ниже, что Response.Cache.SetCacheability (HttpCacheability.NoCache) он теряет рассудок? Тем не менее, мне все еще нравится твой ответ - person deebs; 14.06.2016

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

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

person MatthewMartin    schedule 21.04.2010
comment
Мэтью, зачем предлагать взлом, если есть встроенная функция для решения проблемы? - person Sky Sanders; 22.04.2010
comment
Session.Abandon и FormsAuthentication.SignOut не сообщает браузеру, что нужно очистить его кеш (а браузер и прокси-серверы между ними не должны соблюдать заголовок без кеширования). Кешированные страницы все еще могут быть загружены, и если запрос создается из страницы в клиентском кеше после того, как сеанс запрещен, не сообщая, каким будет результат, возможно, NullReferenceExceptions, когда страница начинает проверять переменные сеанса (и перенаправляет на страницу входа в систему). - person MatthewMartin; 22.04.2010
comment
Затем следует установить запрет на кеширование конфиденциальных или изменчивых страниц, которые не следует восстанавливать. Вы не можете контролировать клиента, а попытки просто усложняют ситуацию. Если они хотят вернуть 3 клика на страницу «истек срок действия» после выхода из системы…?!?! им больше власти. В любом случае, я не преследую тебя, просто говоришь ... p.s. используйте @sky, чтобы получать ответы на комментарии. - person Sky Sanders; 22.04.2010
comment
@Sky Я протестирую это завтра, если у меня будет время, но когда мое приложение прошло проверку безопасности (материалы большой компании), код уже выполнял предложенный вами выход (и все должны, не поймите меня неправильно) ). Так что это было безопасно, но вы все равно могли вернуться назад и просмотреть страницы в кеше. Кроме того, если вы попытаетесь сделать обратную публикацию с одной из этих страниц в кеше, вы будете отправлены на страницу с паролем (так что она безопасна), но при перенаправлении обратно на исходную страницу не будет сказано, будет ли сеанс там. Чтобы было довольно сложно вернуться и сделать репост с устаревшей страницей, мы отключили кнопку «Назад». - person MatthewMartin; 22.04.2010
comment
Прохладный. Я добавил код, который использую для предотвращения кеширования. Я использую это в основном для обработчиков json, но он должен быть применимым и эффективным. - person Sky Sanders; 22.04.2010

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

Response.Cache.SetCacheability(HttpCacheability.NoCache);

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

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
person Michrl Castle    schedule 22.08.2012


Вы можете попробовать использовать свойство 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

Справочная информация

person vic    schedule 08.12.2010

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

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

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>
person S.Mohamed    schedule 09.07.2018

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

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

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

person Eatdoku    schedule 21.04.2010
comment
Эй, повернись, я думаю, ты где-то сошла с ума ... ;-p Это все равно что пытаться починить часы кувалдой. Мягко говоря, это подходит для DWTF. Пожалуйста, подумайте еще раз. - person Sky Sanders; 22.04.2010