1

私は現在、ユーザー認証を使用してMVC3Webサイトで作業しています。

このセキュリティ上の問題があり、ページから正常にログアウトした後、ユーザーが戻るボタンを押して再ログインできないようにします。

私は多くの解決策を研究しましたが、それを自分のプロジェクトに適用する方法がわかりません。MVC3でそれを行うことは可能ですか?

4

3 に答える 3

2

John のソリューションの問題点は、キャッシュが実際には非常に便利であり、おそらくこの機能をアプリから削除したくないということです。

この問題を解決する簡単な方法は、ユーザーがログアウトした場合に出力 HTML ページを強制的に更新することです。これは、リクエストの開始時に JavaScript を使用して ajax リクエストをサーバーに送り返し、ユーザーがまだログインしていることを検証することで実現できます。ユーザーがログアウトしている場合は、クライアント側で同じサーバーにリダイレクトするだけです。ページ。これにより、問題が効果的に解決されるはずです。

于 2012-06-06T06:43:59.900 に答える
2

再ログインしていません。ブラウザのキャッシュからページを表示しているだけです。デバッグしようとすると、ブラウザの戻るボタンでコードが実行されないことがわかります。ログアウトして戻るボタンを押した後に何かをクリックしようとすると、ログイン ページにリダイレクトされます (デフォルトの mvc3 アプリの動作のままにした場合)。

いくつかの解決策があり、これが私の見解です。

  1. カスタムの ActionFilterAttribute を作成して、コントローラーまたは/およびこのようなアクションでのキャッシュを防止し、それをアクション/コントローラーに適用するだけです。

    public class NoClientCache : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
            filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
            filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
            filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache);
            filterContext.HttpContext.Response.Cache.SetNoStore();
    
            base.OnResultExecuting(filterContext);
        }
    }
    
  2. ブラウザのクライアント側をトリガーすることにより、ログアウトが実行された後に強制的に更新できます

    history.go(1);

追加: 単一の場所からログアウトする場合は、最初の方法を使用する必要がありますが、ログアウト ボタンがレイアウト ページにある場合、すべてのページでキャッシュを無効にするのは良くないため、2 番目の方法が適しているようです。

于 2012-06-06T06:54:55.120 に答える
1

ユーザーが戻るボタンをクリックすると、ブラウザは単にキャッシュされたページを再表示しています。

ブラウザがページをキャッシュせず、これが起こらないようにしたい場合は、HTTP 応答ヘッダーでそのように指示する必要があります。

キャッシュしたくないすべての HTTP 応答と共に以下のコードを実行する必要があります。

HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Cache-Control", "private"); //to be safe cross browser

このコードをカスタム ベース コントローラー (以下) に含めると、サイト全体でのコードの重複を避けることができます。

public class CustomBaseController : Controller
{
    protected override void OnResultExecuting(ResultExecutingContext context)
    {   
        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
        HttpContext.Current.Response.AddHeader("Cache-Control", "private"); //to be safe cross browser
    }
}

上記のアプローチを使用する場合、ユーザーが戻るボタンでキャッシュされたページを表示できないようにする場合は、すべてのコントローラーが「CustomBaseController」から継承されるようにしてください。

于 2012-06-06T06:23:40.003 に答える