歩哨とAzureのWebサーバのログの組み合わせを使用して、調査にかなりの時間を過ごした後、私が言及したエラーの2つの主要な原因を見つけましたブラウザはバックグラウンドにあり、OSによって突然停止してリソースを解放する可能性があります。これが起こると、通常、ページは携帯電話のドライブに保存され、ブラウザが再オープンされるとそこからリロードされます。
しかし、この時点ではセッションクッキーである偽造トークンは本質的に新しいセッションであるため、すでに期限切れになっています。そのため、前のセッションのHTMLを使用して、偽造Cookieなしでページが読み込まれます。これにより、The required anti-forgery cookie is not present
例外が発生します。
2)一見関連性がありますが、tokens do not match
の例外は通常、接線方向にのみ関連しています。原因は、同時に複数のタブを開くというユーザーの行動のようです。
偽造防止クッキーは、ユーザーがフォームのあるページに到着したときにのみ割り当てられます。これは、彼らがあなたのホームページに行くことができ、偽造防止クッキーを持たないことを意味します。次に、中クリックを使用して複数のタブを開くことができます。複数のタブは、複数の並列リクエストです。それぞれは、偽造防止クッキーがありません。
これらの要求には、偽造防止クッキーがないため、ASP.NETはクッキー用に別個の疑似ランダムトークンを生成し、それをフォーム内で使用します。ただし、受信した最後のヘッダーの結果のみが保持されます。これは、偽造防止クッキーが無効になっているため、他のすべてのページにページ上の無効なトークンがあることを意味します。
解決のために、私は世界の偽造防止クッキーはページをno形式を持っていない場合でも、任意のページに割り当てられている
- いることを確認する必要があり、フィルタ、および
- アンチを作成しました-Forgery Cookieはセッションにバインドされていません。ライフタイムはユーザーのログイントークンに合わせて調整する必要がありますが、セッションがなくてもモバイルデバイスがページを再読み込みする場合は、セッション間で存続する必要があります。
以下のコードはFilterAttribute
であり、グローバルフィルタとしてFilterConfig.cs
に追加する必要があります。 これはセキュリティホールを作成するとは思わないが、私は決してセキュリティ専門家ではないので、どんな情報も歓迎する。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AntiForgeryFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var cookie = filterContext.HttpContext.Request.Cookies.Get(AntiForgeryConfig.CookieName);
var addCookie = true;
if (string.IsNullOrEmpty(cookie?.Value))
{
cookie = filterContext.HttpContext.Response.Cookies.Get(AntiForgeryConfig.CookieName);
addCookie = false;
}
if (string.IsNullOrEmpty(cookie?.Value))
{
AntiForgery.GetTokens(null, out string cookieToken, out string _);
cookie = new HttpCookie(AntiForgeryConfig.CookieName, cookieToken)
{
HttpOnly = true,
Secure = AntiForgeryConfig.RequireSsl
};
}
cookie.Expires = DateTime.UtcNow.AddYears(1);
if(addCookie) filterContext.HttpContext.Response.Cookies.Add(cookie);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
この回答はこれまでに見つかりましたか。 –
いいえ、私たちは偽造防止チェックを取り除かなければなりませんでした(簡単な統合フォームに使用されました。私たちのAzureのセットアップには2つの論理的なCDがありましたので、要求と応答を扱う異なるCDに関係していると思います。それは私の推測です。 – TamerM
これは聞いても悲しいことですが、フォームアクションで定義されたドメインを持たない限り、これは問題にはならないと思いますが(POSTのためにユーザーを別のCDにリダイレクトしますが、 UrlHelperを使用した場合、ドメイン間でユーザーをリダイレクトしないため)。 –