0

.NET MVC 5アプリケーションに.Net 4.5.1を使用しています。アプリケーションはPOSTデータをサーバーに送るいくつかのjQuery ajax postメソッドを持っています。クロスサイトリクエストフォージェリ(XSRF)を防止するために、私は、コントローラ内HttpHeaderValidateAntiForgeryTokenが動作していませんasp.net mvc with ajax投稿

$(document).ajaxSend(function (event, jqXHR, ajaxOptions) { 
      if (ajaxOptions.type === 'POST') { 
       jqXHR.setRequestHeader('__RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val()); 
      }     
     }); 

、その後のすべてのAJAX POSTでトークンを送信_layout.cshtml

@Html.AntiForgeryToken() 

またJavaScriptで次のように追加しましたアクションメソッドは、私が

[ValidateAntiForgeryToken]   
    [HttpPost] 
    public ActionResult Save(MyModel model) 
    { 
     //save and return json data 
    } 

しかしValidateAntiForgeryTokenは

例外をthorwingています

必要な偽造防止フォームフィールド "__RequestVerificationToken"は ではありません。

私は、Ajax POSTごとにhttpヘッダーに__RequestVerificationTokenが追加されていることを確認しました。

ASP.NETコアを使用して開発された別のアプリケーションがありますが、同じ機能があります(ただし、__RequestVerificationTokenの代わりにRequestVerificationTokenです)、ASP.NETコアで動作しています。

ヘッダーにトークンが含まれている場合、同じものがASP.NET MVCで動作しないのはなぜですか? ASP.NET CoreとASP.NET MVC 5のValidateAntiForgeryTokenに違いはありますか?

+0

可能な重複やHtml.AntiForgeryTokenにトークン

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { if (originalOptions.type === "POST") jqXHR.setRequestHeader('__RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val()); }); 

追加トークンを追加します)](http://stackoverflow.com/questions/4074199/jquery-ajax-calls-and-the-html-antiforgerytoken) – VahidN

+0

@VahidNそれは同じ問題ではありません。私は前に提供されたリンクを通過しました。 – LP13

答えて

1

問題を解決するには、setRequestHeaderを除いてすべてが同じままです。私はカスタムValidateAntiForgeryTokenを実施している私の問題を解決するために、リクエストボディ

data: { 
       __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val(), 
       // Other properties of data 
      }, 
+0

はいasp.net mvcで私はデータを追加する場合は、その作業ですか?しかし、私はasp.netコアでそれはあなたが 'データ'または 'ヘッダー'に追加するかどうかに関係なく動作します。私の問題を解決するために私はカスタムValidateAntiForgeryTokenAttributeを実装しました。 – LP13

+0

Asp.netコアは、両方のトークンについてヘッダーとボディをチェックします。 – Kaushal

0

で__RequestVerificationTokenを渡します。私はヘッダーにトークンを含めることに決めました。

  1. 私は私が世界的にそれを検証する各アクションメソッドでそれを追加するアプリケーションを通じて、だからではなく、 のいくつかAjaxのPOSTメソッドを持っています。
  2. クライアント側では、各Ajaxに対して暗黙的にトークンを含める必要があります。 POST要求。
  3. は、Ajax dataはJSONオブジェクトまたは は私がしたい場合は特に、(不可能ではない)トリッキー__RequestVerificationTokendataに少し を追加することになり直列化された形式である可能性があり掲載(アプリケーションは、データを取得するためのAJAX ポスト要求を行う剣道グリッドを持っています)それを処理するには をグローバルに使用します。

だからここに私の完全なコードがある

フィルター

public class ValidatePostAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
    { 
     private const string _tokenKey = "__RequestVerificationToken"; 
     public void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (filterContext == null) 
      { 
       throw new ArgumentNullException("filterContext"); 
      } 

      if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST") 
      { 
       if (filterContext.HttpContext.Request.IsAjaxRequest()) 
       { 
        if (filterContext.HttpContext.Request.Cookies.Get(_tokenKey) == null || 
        filterContext.HttpContext.Request.Headers.Get(_tokenKey) == null) 
        { 
         throw new HttpPostAntiForgeryException("Invalid Verification Token."); 
        } 

        AntiForgery.Validate(filterContext.HttpContext.Request.Cookies[_tokenKey].Value, filterContext.HttpContext.Request.Headers[_tokenKey]); 
       }     
      } 
     } 
    } 

例外

public sealed class HttpPostAntiForgeryException : HttpException 
{ 
    public HttpPostAntiForgeryException() 
    { 
    } 
    public HttpPostAntiForgeryException(string message) : base(message) 
    { 
    } 
} 

は、グローバル

01をフィルタを追加します。軒の
public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new AuthorizeAttribute() { Order = 0 }); 
     filters.Add(new ValidatePostAntiForgeryTokenAttribute() { Order = 1 }); 
    } 
} 

_layout.cshtml - jsが([jQueryのAjaxの呼び出しの_layout.cshtml

@Html.AntiForgeryToken() 
関連する問題