C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

無効なviewstateのエラーについて  /スペックル (24/01/15(Mon) 14:38) #102840
Re[1]: 無効なviewstateのエラーについて  /WebSurfer (24/01/15(Mon) 15:02) #102842
│└ Re[2]: 無効なviewstateのエラーについて  /スペックル (24/01/15(Mon) 15:15) #102843
Re[1]: 無効なviewstateのエラーについて  /WebSurfer (24/01/15(Mon) 16:20) #102844
  ├ Re[2]: 無効なviewstateのエラーについて  /スペックル (24/01/16(Tue) 13:17) #102856
  └ Re[2]: 無効なviewstateのエラーについて  /スペックル (24/01/17(Wed) 19:15) #102862
    └ Re[3]: 無効なviewstateのエラーについて  /WebSurfer (24/01/17(Wed) 19:51) #102863
      └ Re[4]: 無効なviewstateのエラーについて  /スペックル (24/01/19(Fri) 10:02) #102871 解決済み
        └ Re[5]: 無効なviewstateのエラーについて  /WebSurfer (24/01/19(Fri) 10:49) #102872


親記事 / ▼[ 102842 ] ▼[ 102844 ]
■102840 / 親階層)  無効なviewstateのエラーについて 
□投稿者/ スペックル (3回)-(2024/01/15(Mon) 14:38:31)

分類:[ASP.NET (C#)] 

ASP.NET C#のWebFormを使用して開発を行っております。
ViewStateExceptionが出ており、
再現がしないため、困っております。

■発生事象
System.Web.UI.ViewStateException: 無効な viewstate です。
Client IP: クライアントIPアドレス
Port: 36755
Referer: WEBサイトのURL
Path: 要求の仮想パス
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
ViewState: chlzjBqAmUUB0k5DoqY5EaIOg4QP4d3Iu35l9KWnu27jayEEwMNuczGYn/1Kc3lpe2Z8UYAjdIQ5DM8FsBkg2ixuPzy4x+YbcEYsY562Ecd2pmtGePNabdMCKirZcTRS1FHbeO2Xd0gwrGC9rgiuDF0nTZ5YsJ8D7KCinTRF8lgS556BqIrD8cQLA8daZyk2cdXuhlyb17s3J9/F4rQViJYIiqGm2F9unogQmRHuzdMh4BK/VtuK6OddsqD6rBJAVT00YClC8B0KYoY7lzkh36gwA0TbB7eybzZXYddfUzGnUUpNvFveoJd+d8xDleC1m5M8GYLwAKrxWt+9WMAtgRy1vr6icWtHopH7E4fI8wVyfHfn099yne0XYvMovUpCZo0ds7UqiSRJsL5Z2t6+UVw8N3tL9dum5k28ywiXiaccTbJY6fBMOUShMWDZ1wxyXNPAZPnUMEdrrgH65MN8pakHsjYbpua5LzaejJE9rvb6pjD6wbXAZfZMOl+CFFsd1u190IkY4lAz9Awdf7Q6UWVLBnpM4rSz64wnZdK6hOg0QG6+jmM1KnwBq8jeuaK75OXEHVhESikKiyvDL3rMEoTycMjay3WdqPKxAJwkduQJK7Cv0bL+aFxuXFZvCgsjDqQL2KxOdVh/FF7cLe9JfSZxxKjJFzenoF6um0HCh1...

という例外が発生しているが、
発生する画面、タイミングなどが様々で、
発生原因、再現方法がわからない。

■お願いしたいこと
上記のエラーを解決するために
発生原因、再現方法を特定する手段を教えて頂きたい。
確認すると良いポイントなどありましたら、ご教示いただけると助かります。

■その他情報
関係があるか分かりませんが、
クロスサイト・リクエスト・フォージェリの対応として、
Webフォームのマスターページのページ初期化イベントにて、
ViewStateUserKeyにセッションIDを割り当てております。

■環境
Windows 10 Pro
Visual Studio Professional 2017 Version15.9.4
Microsoft .NET Framework Version 4.8.09037(プロジェクトのターゲットフレームワークは4.7.2)
[ □ Tree ] 返信 編集キー/

▲[ 102840 ] / ▼[ 102843 ]
■102842 / 1階層)  Re[1]: 無効なviewstateのエラーについて 
□投稿者/ WebSurfer (2872回)-(2024/01/15(Mon) 15:02:22)
No102840 (スペックル さん) に返信

前のようにレスをもらっても何もフィードバックを返さないまま 1 ヵ月半も放置
するなんてことは改善してもらえるのですかね?
[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102842 ] / 返信無し
■102843 / 2階層)  Re[2]: 無効なviewstateのエラーについて 
□投稿者/ スペックル (4回)-(2024/01/15(Mon) 15:15:36)
2024/01/15(Mon) 15:16:23 編集(投稿者)
2024/01/15(Mon) 15:16:12 編集(投稿者)

No102842 (WebSurfer さん) に返信
> 前のようにレスをもらっても何もフィードバックを返さないまま 1 ヵ月半も放置
> するなんてことは改善してもらえるのですかね?
対応方針確定後に返信しようしておりましたが、忘れてしまっておりました。申し訳ございません。
すぐに返信するように致します
[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102840 ] / ▼[ 102856 ] ▼[ 102862 ]
■102844 / 1階層)  Re[1]: 無効なviewstateのエラーについて 
□投稿者/ WebSurfer (2873回)-(2024/01/15(Mon) 16:20:41)
No102840 (スペックル さん) に返信

> クロスサイト・リクエスト・フォージェリの対応として、
> Webフォームのマスターページのページ初期化イベントにて、
> ViewStateUserKeyにセッションIDを割り当てております。

質問に提供されている情報ではそこ以外に怪しいところは見当たりません。(質問に
書いてないところかもしれませんが、見えないので分かりません)

たぶん、マスターページで、

void Page_Init(object sender, EventArgs e)
{
ViewStateUserKey = Session.SessionID;
}

というようなコードを書いていると思いますが、Session.SessionID がポストバック前後
で異なると ViewStateException がスローされます。

Session.SessionID をポストバック前後で同じにするためには、最初の要求の応答にセッ
ション cookie を含めて送信し、以降はクライアントからサーバーに要求を送る都度その
cookie を送信する必要があります。

SessionState 情報を格納しない場合(Session["Data"] = xxxx; というようなコードが
存在しない場合)もしくは Global.asax に Session_Start ハンドラがない場合、サー
バーはセッション Cookie を発行しないとことに注意してください。そこは問題ないで
すよね?

上の Page_Init コードで、SessionID は SessionStateModule が生成しますが、クライ
アントから Cookie が送られてこなければ SessionStateModule が生成する SessionID
の値はリクエストのたび異なります。

結果、ViewStateException がスローされサーバーエラーとなります。

質問者さんのケースでは、

> 発生する画面、タイミングなどが様々で、

とのことなので、その画面・タイミングで、何らかの事情でクライアントから cookie が
送られないということではなかろうかと思います。

何故そう言うことになるのかは第三者には分かりません。質問者さんの方で調べてもらう
ほかないと思います。

CSRF 対策に SessionID を使うのはあっさり諦めて、Visual Studio 2022 のテンプレート
で作る Web アプリケーションプロジェクトのマスターページに実装されているようにする
という手もあると思います。詳しくは以下の記事を見てください。

ASP.NET の CSRF 対策
http://surferonwww.info/BlogEngine/post/2023/05/02/countermeasures-against-csrf-in-aspnet-web-application.aspx
[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102844 ] / 返信無し
■102856 / 2階層)  Re[2]: 無効なviewstateのエラーについて 
□投稿者/ スペックル (5回)-(2024/01/16(Tue) 13:17:45)
No102844 (WebSurfer さん) に返信
ご回答ありがとうございます。

> SessionState 情報を格納しない場合(Session["Data"] = xxxx; というようなコードが
> 存在しない場合)もしくは Global.asax に Session_Start ハンドラがない場合、サー
> バーはセッション Cookie を発行しないとことに注意してください。そこは問題ないで
> すよね?
SessionState 情報を必ず格納しているため、問題ないと考えております。

> CSRF 対策に SessionID を使うのはあっさり諦めて、Visual Studio 2022 のテンプレート
> で作る Web アプリケーションプロジェクトのマスターページに実装されているようにする
> という手もあると思います。詳しくは以下の記事を見てください。
>
> ASP.NET の CSRF 対策
> http://surferonwww.info/BlogEngine/post/2023/05/02/countermeasures-against-csrf-in-aspnet-web-application.aspx
ご提示頂いた内容を元に、実装を行うかも含めて検討させていただきます。
対応方針確定後に再度、ご連絡いたします
[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102844 ] / ▼[ 102863 ]
■102862 / 2階層)  Re[2]: 無効なviewstateのエラーについて 
□投稿者/ スペックル (6回)-(2024/01/17(Wed) 19:15:39)
No102844 (WebSurfer さん) に返信
追加でご質問です。

> たぶん、マスターページで、
>
> void Page_Init(object sender, EventArgs e)
> {
> ViewStateUserKey = Session.SessionID;
> }
>
> というようなコードを書いていると思いますが、Session.SessionID がポストバック前後
> で異なると ViewStateException がスローされます。
ポストバック前後で異なる場合、ViewStateException がスローされるとのことですが、
ポストバック以外では発生しないものなのでしょうか?
(例えば、画面Aから画面Bへの遷移時など)


[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102862 ] / ▼[ 102871 ]
■102863 / 3階層)  Re[3]: 無効なviewstateのエラーについて 
□投稿者/ WebSurfer (2880回)-(2024/01/17(Wed) 19:51:18)
No102862 (スペックル さん) に返信

> ポストバック前後で異なる場合、ViewStateException がスローされるとのことですが、
> ポストバック以外では発生しないものなのでしょうか?

基本そうです。私の想像の範囲を超えるような何かをしてなければですが。

先に紹介した記事をちゃんと読んでないでしょ? それに例外発生のメカニズムが書い
てありますので読んでください。

> (例えば、画面Aから画面Bへの遷移時など)

何か心当たりがあるのですか? だったらそれを書きましょう。人に聞くばかりでは
なくて、そちらからも情報を提供するのが筋です。

[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102863 ] / ▼[ 102872 ]
■102871 / 4階層)  Re[4]: 無効なviewstateのエラーについて 
□投稿者/ スペックル (7回)-(2024/01/19(Fri) 10:02:48)
No102863 (WebSurfer さん) に返信
ご回答ありがとうございます。

お陰様で、発生方法がわかりました。

システムの要件として、
ブラウザのマルチタブでの操作を許容しております。
別タブでユーザのログアウト→ログインをし、ポストバック操作をした際に、
事象が発生することがわかりました。

手順としては、
1.タブAにてユーザがログイン
2.タブBを作成し、システムのログイン後の画面を開く
3.タブBにて、ログアウトし、再度ログイン(ここでセッションIDを変更)
4.タブAにて、ポストバック操作時にViewStateExceptionが発生。

一旦運用でカバーする方向となりました。
ありがとうございました。
解決済み
[ 親 102840 / □ Tree ] 返信 編集キー/

▲[ 102871 ] / 返信無し
■102872 / 5階層)  Re[5]: 無効なviewstateのエラーについて 
□投稿者/ WebSurfer (2881回)-(2024/01/19(Fri) 10:49:37)
No102871 (スペックル さん) に返信

> 3.タブBにて、ログアウトし、再度ログイン(ここでセッションIDを変更)

そこのところ何か普通でないことをしてますよね? 独自の認証システムですか?

ASP.NET が提供している認証システムは、旧来の Forms 認証も、現在の ASP.NET
Identity も、ASP.NET で言う Session とは全く関係なくて、ログアウト・ログイン
操作で「セッションIDを変更」などということはしません。
[ 親 102840 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -