web-dev-qa-db-ja.com

ブラウザの戻るボタンを使用したASP.NET認証のログインとログアウト

ユーザーがブラウザの戻るボタンを使用してログアウトすると前のページに移動するためのソリューションを探しています。

Asp.netにWebアプリケーションを構築し、認証と承認にカスタムメンバーシッププロバイダーを使用しています。ユーザーがログアウトリンクをクリックしてアプリケーションからログアウトし、デフォルトのカバーページにリダイレクトされる場合を除き、すべて正常に機能します。ブラウザの[戻る]ボタンをクリックすると、実際には以前の場所に戻り、データは引き続き表示されます。

もちろん、そのページでは何もできません。ログインページに再度リダイレクトされるリンクをクリックします。しかし、これらの情報を表示することは、多くのユーザーを混乱させます。

ブラウザの履歴をクリアして使用できないようにする方法があるか、または戻るボタンをクリックしてログインページにリダイレクトする方法があるかどうか疑問に思っています。

ありがとう

29
Eatdoku

ブラウザの履歴と戻るボタンを心配すると、頭痛や性器いぼができます。この問題を処理するための機能が組み込まれています。

ログアウトリンク/ボタンは、このコードを含むページを、必要なものと一緒に指す必要があります。

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

コードはこれに由来します page そして有効ですが、ページは目に見えません。

バックボタンの動作に関する適切な質問/回答は こちら にあります。

更新:

私がマシューと話している会話に従って、機密または揮発性の個々のページのキャッシュを無効にするには、次のようなコードを使用します。

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

私と同じように機能するかどうか知りたいです。

23
Sky Sanders

Javascriptを使用して、戻るボタンを無効にすることができます(通常は、ユーザーを別のページに転送するページに送信し、[戻る]をクリックすると再び転送されるようにします)。永続的なユーザーは、履歴を2ステップ戻してループをステップオーバーできます。

そのページはブラウザのキャッシュにあります。ブラウザに何もキャッシュしないように依頼することもできますが、これによりパフォーマンスが劇的に低下する場合があるため、お勧めしません。

3
MatthewMartin

このコードは非常に便利です

Response.Cache.SetCacheability(HttpCacheability.NoCache);

このコードは、ロードイベント、マスターページの場合にのみ配置しますが、IEでのみ動作します。IEおよび使用したFirefox

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
1
Michrl Castle

あなたの答え

これを回避するには、logout.aspxページのセクションに次のJavaScriptコードを追加します。

<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
Tejas

最善の回避策は、マスターページに次のコードを配置することです。ページのキャッシュを回避し、ログアウト後にユーザーがアクセスできないようにします。

追伸:次のコードは、さまざまなソースからのコンパイルです。ここに投稿して、解決策を探している人が誰でも役に立つと思うように

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
S.Mohamed

それが役立つ場合は、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
vic