2017-10-11 62 views
5

私たちはいくつかのフォームを持つページを持っています。それぞれに独自の@Html.AntiForgeryToken()があります。私のローカルマシンではすべてが素晴らしいです。__RequestVerificationTokenが常に作成されているとは限りません

Azure(PAAS)にデプロイしましたが、すべてのリクエストでに__RequestVerificationTokenが作成されていません。いつかそこにいていつか私は必要な偽造防止クッキーが存在しませんそしてまれにトークンがエラーと一致しません。

私はこの時点で完全に無知です。コードやAzure環境に何か問題があるかどうかはわかりません。これらのフォームにはアヤックスはありません。

私たちは、web.config<machineKey>セクションを追加しました。キャッシングなし。新しいデバイスで初めて発生することがあります。

+0

この回答はこれまでに見つかりましたか。 –

+0

いいえ、私たちは偽造防止チェックを取り除かなければなりませんでした(簡単な統合フォームに使用されました。私たちのAzureのセットアップには2つの論理的なCDがありましたので、要求と応答を扱う異なるCDに関係していると思います。それは私の推測です。 – TamerM

+0

これは聞いても悲しいことですが、フォームアクションで定義されたドメインを持たない限り、これは問題にはならないと思いますが(POSTのためにユーザーを別のCDにリダイレクトしますが、 UrlHelperを使用した場合、ドメイン間でユーザーをリダイレクトしないため)。 –

答えて

1

あなたの問題は、1ページに異なる偽造防止トークンを持つ複数のフォームがあることに起因すると思います。 ページが要求されると、フォームの非表示フィールドには2つの異なるトークンがありますが、クッキーには1つのトークンしかありません。 フォームPOSTにエラーが発生する不一致トークンが含まれています。

ページに1つのフォームのみが含まれている場合、AFTがどのように機能するかお試しください。それが正常に動作する場合、私の仮定は正しいです。

This answerには、複数のフォームを持つページの可能な解決策が含まれていますが、説明されているようなセキュリティ上の短所があります(here)。

ローカルホストですべてが正常に動作する理由がわかりません。 私はシンプルなアプリケーションを作成し、正しいクッキートークンを使ってフォームPOSTを試しましたが、前のセッションの古いフォームトークンを試しました。私の驚いたことに、このようなPOSTは成功します。 この場合、asp.netにはローカルリクエストに対する特別な処理があります。私はこれに関する情報が見つかりませんでした。

私の答えは、まだあなたは、さらなる分析のために、以下のデータを提供してください可能性が解決しない場合:返されたHTTPヘッダで

  1. オリジナルページ要求をして偽造防止トークンを形成します。
  2. 送信HTTPヘッダーを含むPOSTリクエスト。携帯電話で

    1)、とき:

+0

OPの投稿に基づいて、トークンの不一致(複数のトークンがある場合はbtw)ではなく、常に存在する問題のようには見えません。 また、ASP.NETは比較前に偽造防止トークンを復号化します。フォームに2つの異なるトークンがある場合は、どちらもクッキーに対応するデータが含まれていても問題ありません。 また、自分のシステムで複数のフォームとフォームトークンが問題ではないことがわかりました。問題は、ブラウザから送信されたCookieがまったくないことです。 –

+0

真のトークンは、単にバイナリバッファとして比較されるのではなく、復号化され、内部に保持されているセキュリティトークンによって比較されます。偽造防止トークン内部に関する良い記事:https://www.codeproject.com/Articles/793384/ASP-NET-Anti-Forgery-Tokens-internals OPは時には「トークンがエラーに合致しない」ということを言いましたので、私の前提は依然として問題になる可能性があります。そうでない場合は、私が答えの一番下に要求した情報は、少なくともそれがローカルクライアントかリモートサーバーの問題かどうかを明確にする必要があります。 – CodeFuller

0

歩哨とAzureのWebサーバのログの組み合わせを使用して、調査にかなりの時間を過ごした後、私が言及したエラーの2つの主要な原因を見つけましたブラウザはバックグラウンドにあり、OSによって突然停止してリソースを解放する可能性があります。これが起こると、通常、ページは携帯電話のドライブに保存され、ブラウザが再オープンされるとそこからリロードされます。

しかし、この時点ではセッションクッキーである偽造トークンは本質的に新しいセッションであるため、すでに期限切れになっています。そのため、前のセッションのHTMLを使用して、偽造Cookieなしでページが読み込まれます。これにより、The required anti-forgery cookie is not present例外が発生します。

2)一見関連性がありますが、tokens do not matchの例外は通常、接線方向にのみ関連しています。原因は、同時に複数のタブを開くというユーザーの行動のようです。

偽造防止クッキーは、ユーザーがフォームのあるページに到着したときにのみ割り当てられます。これは、彼らがあなたのホームページに行くことができ、偽造防止クッキーを持たないことを意味します。次に、中クリックを使用して複数のタブを開くことができます。複数のタブは、複数の並列リクエストです。それぞれは、偽造防止クッキーがありません。

これらの要求には、偽造防止クッキーがないため、ASP.NETはクッキー用に別個の疑似ランダムトークンを生成し、それをフォーム内で使用します。ただし、受信した最後のヘッダーの結果のみが保持されます。これは、偽造防止クッキーが無効になっているため、他のすべてのページにページ上の無効なトークンがあることを意味します。

解決のために、私は世界の偽造防止クッキーはページをno形式を持っていない場合でも、任意のページに割り当てられている

  1. いることを確認する必要があり、フィルタ、および
  2. アンチを作成しました-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) 
    { 
    } 
} 
関連する問題