MVC 3.0 アプリがあります。本番環境では、「必要な偽造防止トークンが提供されていないか、無効でした」という例外をランダムに受け取ります。これはすべてのユーザーに発生するわけではないため、偽造防止トークン プロセスは適切にセットアップされていると言っても過言ではありません。ただし、一部のユーザーは、サイトにサインインするたびに発生します。サインオンし、検証中の投稿を生成するリンクをクリックすると、検証が失敗し、エラー ページが表示され、クリックして戻って再度投稿すると、すべて問題ありません。
何が起こっているのか全くわかりません。
MVC ソース コードを調べたところ、「必要な偽造防止トークンが提供されていないか、無効でした」という説明の例外がスローされる場所がいくつか見つかりました。1 つ目は、トークンが AntiForgeryDataSerializer.cs で逆シリアル化されているときです。ただし、これは問題の場所ではありません。この場合、実際のシリアル化の問題を説明する内部例外とともに例外がスローされるためです。内部例外をログに記録していますが、この場合はログに記録していません。
この例外がスローされる別の場所は、AntiForgeryWorker.cs の Validate メソッドです。ここでは、内部例外なしで例外がスローされているため、問題はこのコードのどこかにあるはずです。次のようになります。
public void Validate(HttpContextBase context, string salt) {
Debug.Assert(context != null);
string fieldName = AntiForgeryData.GetAntiForgeryTokenName(null);
string cookieName = AntiForgeryData.GetAntiForgeryTokenName(context.Request.ApplicationPath);
HttpCookie cookie = context.Request.Cookies[cookieName];
if (cookie == null || String.IsNullOrEmpty(cookie.Value)) {
// error: cookie token is missing
throw CreateValidationException();
}
AntiForgeryData cookieToken = Serializer.Deserialize(cookie.Value);
string formValue = context.Request.Form[fieldName];
if (String.IsNullOrEmpty(formValue)) {
// error: form token is missing
throw CreateValidationException();
}
AntiForgeryData formToken = Serializer.Deserialize(formValue);
if (!String.Equals(cookieToken.Value, formToken.Value, StringComparison.Ordinal)) {
// error: form token does not match cookie token
throw CreateValidationException();
}
string currentUsername = AntiForgeryData.GetUsername(context.User);
if (!String.Equals(formToken.Username, currentUsername, StringComparison.OrdinalIgnoreCase)) {
// error: form token is not valid for this user
// (don't care about cookie token)
throw CreateValidationException();
}
if (!String.Equals(salt ?? String.Empty, formToken.Salt, StringComparison.Ordinal)) {
// error: custom validation failed
throw CreateValidationException();
}
}
それらの1つは例外をスローしています。私は塩を使用していないので、最後の塩を捨てます。IIS ログを調べると、Cookie が表示されます。Cookie が欠落しているわけではありません。したがって、フォームの値が欠落している (可能性は低いと思います)、値が一致しない、またはユーザー名が一致しないのいずれかです。私は途方に暮れています。これを再現できないので、本当にデバッグできません。同じユーザーに何度も発生しているようですが、彼らが何をしているかのパターンを思いつくことはできません. この時点に到達するためにサイトにログインするためにも Cookie をオンにする必要があるため、それは問題ではありません. ユーザーはログインし、フォームを送信し、8 ~ 10 秒以内にエラーが発生します。エラーページを見た後、戻るボタンを押すように見え、投稿を再試行してください。問題ありません。
次に進む方法について何か考えはありますか?