これは、以下にリンクされている SO の投稿、およびおそらく他のいくつかのブログで十分にカバーされていると思います (「viewstate mac validation failed」をグーグルで検索すると、多くの説明と修正が明らかになります)。
20 分以上ページにいると、viewstate MAC の検証に失敗しました
場合によってPostBackUrl
は、ログインButton
を投稿先のページ名と同じに設定すると、問題が解決します。
そうでないケースがありました.COTS製品を販売していたので、この悪名高い問題を回避するためにユーザーが構成を更新することに常に頼ることができませんでした. この問題を克服するために、JavaScript を少し使用しました。解決策は次のようになります。
- スクリーンセーバーとしても機能する「スプラッシュスクリーン」ページを作成します。おそらく、ロゴを表示し、数秒ごとにページ内をランダムに移動して、素敵な効果を得ることができます(私はこれを行いました)。スプラッシュ スクリーン ページでクリックまたはキーを押すと、ユーザーはログイン フォーム ページの URL に移動する必要があります。
- ログイン フォームから、
Session.Timeout
(分単位の整数) の値を JavaScript にレンダリングします。
- 認証されていないユーザーがログインフォームに座っている時間を監視するために起動し
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>