2

ですから、これが答えられるかどうか疑問に思い始めたとしても、質問は単純です...

推奨されるViewStateUserKeyを使用してビューステートを保護したいWebサイトがあります。

私のベースページ(明らかにページから継承された)には、次のコードがあります:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (User.Identity.IsAuthenticated)
            base.ViewStateUserKey = Session.SessionID;
    }

ローカルホストでは正常に動作しますが、ホスティング(ローカルプロバイダーの1つが提供する共有ホスティング)にアップロードすると、認証後に従来の「ビューステートMACの検証に失敗しました」エラーが発生します。このコードをコメントアウトすると、完全に機能するので、これが原因であると1000%確信しています。

共有ホスティングでビューステートセキュリティを実行するための最良のアプローチは何ですか?ViewStateMac="Enabled"も設定済みです。それで十分ですか、それとも推奨される回避策は何ですか?

4

1 に答える 1

1

サーバーではなくローカルホストで再生された瞬間から、セッションに問題があり、サーバー上でセッションIDが変更/期限切れになり、認証の有効期限が切れるよりも速いようです。

そのため、ユーザーがページを表示してから投稿するまで、認証が変更される前にセッションが期限切れになるか変更されるため、セッション ID が異なり、このエラーが発生します。

あなたが見ることができると思う他の人は、machineKeyweb.configで設定したことです。

アップデート

あなたのコードをあなたが別のものにしたスコットと比較してください。Scott はユーザー名を使用しますが、これはまったく変更されません。あなたは sessionid を使用しますが、これは私が言うように変更できます。

私にとっては、スコットが提案するもの、ユーザー名、ユーザーのCookieなど、変更されない他の値を使用します。これは簡単には変更できません。

スコットからhttp://www.hanselman.com/blog/ViewStateUserKeyMakesViewStateMoreTamperresistant.aspx

void Page_Init (Object sender, EventArgs e)
{ 
   if (User.Identity.IsAuthenticated)
      ViewStateUserKey = User.Identity.Name;
}

そして、これが scott がユーザーが認証されているかどうかを確認する理由です。これは、ユーザーの名前を取得するためです。ユーザーのセッション ID または Cookie を使用する場合は、認証されているかどうかを確認する必要はありません。

Cookie を使用して viewstateuserkey に設定すると、Cookie を許可しないすべてのユーザーに対して、投稿しようとするとエラーが発生します。それで、それらを処理するためにそのような解決策を考えてください

https://stackoverflow.com/a/2551810/159270

于 2012-06-02T12:50:06.633 に答える