1

ASP.NET サイト (4.5) を継承しました。サイトは、自動生成された ViewState 暗号化キーを使用して、(ホスト環境内の) 単一サーバー上で実行されています。

サイトが再起動されるたびに、ユーザーがログイン ページ (基本的にはテキストを含む asp:Login コントロール) に正しくリダイレ​​クトされるにもかかわらず、ブラウザーを閉じるまで MAC 検証エラーが発生します。

この問題の発生を防ぐために、ユーザーがログインするたびにViewStateが完全にカリング/クリアされるようにすることが可能かどうか/方法を知りたいです。ブルートフォースリダイレクトなどを行う必要がありますか?

ログイン コントロールの DestinationPageUrl が、クエリ文字列のページではなく、静的な値に設定されていることに注意してください。これは問題になりますか?

ViewState 検証の無効化、静的キーの生成、または永続的な ViewState 処理の実装を提案する回答は、反対票を投じられます。ありがとう。

4

1 に答える 1

2

これは、以下にリンクされている SO の投稿、およびおそらく他のいくつかのブログで十分にカバーされていると思います (「viewstate mac validation failed」をグーグルで検索すると、多くの説明と修正が明らかになります)。

20 分以上ページにいると、viewstate MAC の検証に失敗しました

場合によってPostBackUrlは、ログインButtonを投稿先のページ名と同じに設定すると、問題が解決します。

そうでないケースがありました.COTS製品を販売していたので、この悪名高い問題を回避するためにユーザーが構成を更新することに常に頼ることができませんでした. この問題を克服するために、JavaScript を少し使用しました。解決策は次のようになります。

  1. スクリーンセーバーとしても機能する「スプラッシュスクリーン」ページを作成します。おそらく、ロゴを表示し、数秒ごとにページ内をランダムに移動して、素敵な効果を得ることができます(私はこれを行いました)。スプラッシュ スクリーン ページでクリックまたはキーを押すと、ユーザーはログイン フォーム ページの URL に移動する必要があります。
  2. ログイン フォームから、Session.Timeout(分単位の整数) の値を JavaScript にレンダリングします。
  3. 認証されていないユーザーがログインフォームに座っている時間を監視するために起動しwindow.loadて使用するなどのJavaScript関数を作成します。setInterval()セッションのタイムアウトが近づいたら、#1 で作成したスプラッシュ スクリーン ページにリダイレクトします。

(スプラッシュ スクリーン方式の代わりに、ログイン フォームを強制的に更新することもできますが、ユーザーが週末にブラウザをログイン フォームに置いたままにしておくと、非アクティブのために ASP.NET アプリが自動的にシャットダウンするのを防ぐことができます (非アクティブのために実際にシャットダウンするのに十分なほどトラフィック量が少ないサイトがある))。

コード例: (これを login.aspx に入れます)

<script type="text/javascript">
    var sessionTimeout = <%=Session.Timeout.ToString()%>;
    var sessionTimeoutMs = sessionTimeout * 1000;
    var refreshLoginForm = false;
    var redirectToSplashPage = true;
    setTimeout(function()
    {
        if(window.console && window.console.log) { window.console.log("ASP.NET Session expired."); }
        if(refreshLoginForm)
        {
            // method 1: refresh login form to get a fresh viewstate
            window.location.href = window.location.href;
        }
        else if (redirectToSplashPage)
        {
            // method 2: redirect to a splash screen / screen saver page
            // that will link back to login form and request a fresh viewstate.
            window.location.href = "login_splashscreen.html";
        }
    }, sessionTimeoutMs);
</script>
于 2013-10-25T20:39:37.953 に答える