2017-07-18 16 views
1

MVCコードをバージョン2.0から4.0にアップグレードしました。 これで、次のエラーが表示されます。 "必要な偽造トークンが提供されていないか、無効です。"AntiForgeryTokenが無効です

は私がValidateAntiForgeryTokenAttribute.csに以下のコードを追加している:「filterContext」で

public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     string httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride(); 
     if (!this.verbs.Verbs.Contains(httpMethodOverride, StringComparer.OrdinalIgnoreCase)) 
     { 
      return; 
     } 

     AntiForgeryDataSerializer antiForgeryDataSerializer = new AntiForgeryDataSerializer(); 
     AntiForgeryData antiForgeryData = new AntiForgeryData(); 
     string fieldName = antiForgeryData.GetAntiForgeryTokenName(null); 
     string cookieName = antiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath); 


     HttpCookie cookie = filterContext.HttpContext.Request.Cookies[cookieName]; 

     if (cookie == null || String.IsNullOrEmpty(cookie.Value)) 
     { 
      throw CreateValidationException(); 
     } 

     AntiForgeryData cookieToken = antiForgeryDataSerializer.Deserialize(cookie.Value); 
     //Rest of the code here// 
     } 

は、クッキー名は「_RequestVerificationToken」であると、私はパス名を追加します。パス名はBase64でエンコードされ、AntiForgeryFieldNameに追加され、これは "_RequestVerificationToken_Lw__"になります。 クッキーが存在するかどうかを確認すると、明らかに見つからず、AntiForgery例外が発生します。 しかし、このコードの古いバージョンでは、 "filterContext"のCookie値は "_RequestVerificationToken_Lw__"となり、正常に動作します。 ここで問題はどこにありますか?それはマシンキーや何か他のものに関係していますか?

ありがとうございます。

+2

ここで何をやっているのか分かりません。反偽造はMVCに組み込まれています。独自の属性は必要ありません。あなたのコントローラのアクションで組み込みの 'ValidationAntiForgeryToken'属性を使用し、ビューで' @ Html.AntiForgeryToken() 'を使用してください。 –

答えて

0
ビューで

@ Html.AntiForgeryToken()の呼び出しは、新しいトークンを生成し、このような形で書いている:

<form action="..." method="post">   
    <input name="__RequestVerificationToken" type="hidden"   
     value="J56khgCvbE3bVcsCSZkNVuH9Cclm9SSIT/ywruFsXEgmV8CL2eW5C/gGsQUf/YuP" /> 
     <!-- Other fields. -->  
</form> 

をしてもクッキーに書き込み:

__RequestVerificationToken_Lw__= 
    J56khgCvbE3bVcsCSZkNVuH9Cclm9SSIT/ywruFsXEgmV8CL2eW5C/gGsQUf/YuP 

上記のフォームが提出されると、両方ともサーバーに送信されます。 、[ValidateAntiForgeryToken]属性は、それらを検証するためのコントローラやアクションを指定するために使用され、サーバー側で

[HttpPost] 
[ValidateAntiForgeryToken()] 
public ActionResult Action(/* ... */) 
{ 
    // ... 
} 

すべてを行う必要がビューにAntiForgeryTokenを起動して指定することです「ValidateAntiForgeryToken」コントローラアクションの属性。

+0

ありがとうございます。はい、Viewで@ html.AntiForgeryToken()を使用していますが、コントローラで[ValidateAntiForgeryToken]属性を使用しています。これが、質問で提供した「OnAuthorization」メソッドの土地です。私たちが直面してきた大きな問題は、MVC 4.0では "_RequestVerification_Lw__"クッキーが生成されないということです。 HttpContext.Request.Cookiesには、Cookie名として "_RequestVerificationToken"とそれに対応するエンコードされた値のみがあります。どんな助けもありがとうございます。 –

+0

ソースを見ると、「__RequestVerificationToken」だけが生成されます。クッキーが見つからない場合、 "CreateValidationException"をスローするのではなく、 "__RequestVerificationToken"でのみ検証するこのコード行を追加することができます。それが動作するかどうか私に教えてください! AntiForgery.Validate(cookie!= null?cookie.Value:null、httpContext.Request.Headers ["__ RequestVerificationToken"]); – SailajaPalakodeti

+0

この変更により、次のエラーが発生します。 '/'アプリケーションのサーバーエラー。 必要な偽造防止クッキー "__RequestVerificationToken"が存在しません。 説明:現在のWeb要求の実行中に、未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。 例外の詳細:System.Web.Mvc.HttpAntiForgeryException:必要な偽造防止Cookie "__RequestVerificationToken"が存在しません。 –

関連する問題