2011-12-19 72 views
2

我已經使用AntiForgeryToken處理多個表單提交的代碼如下多AJAX表單提交通過防僞令牌

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var ctx = filterContext.HttpContext; 
     var response = filterContext.HttpContext.Response; 

     var request = filterContext.HttpContext.Request; 
     string _antiForgToken = request.Form.GetValues("__RequestVerificationToken")[0]; 
     if (ctx.Session["userform"] != null) 
     { 
      if (_antiForgToken.Equals(ctx.Session["userform"].ToString())) 
      { 
       //kill the request     
       response.StatusCode = 400; 
       response.StatusDescription = "Bad Request.";     
      } 
     } 
     else 
      ctx.Session["userform"] = _antiForgToken; 

    } 

的代碼工作正常的(正常)的形式,但如果形式是它給人的問題通過ajax多次發佈(這是一個必需的功能)我有一個表格說例如Add Contacts用戶添加一個聯繫人phone並按下輸入(ajax)請求正常完成,但再次以相同的形式用戶選擇電子郵件並按回車在這裏我得到的錯誤,因爲AntiforgeryToken是相同的,這是早先生成的我的問題是我如何刷新AntiForgeryToken上ajax蘇CCESS

+0

看到這個: - http://stackoverflow.com/questions/8271085/how-can- i-use-multiple-ajax-forms -with-antiforgery-validation-on-the-same-mvc3-p – 2011-12-19 08:42:50

+0

@KuumeshKumawat它不是同一個問題 – tugberk 2011-12-19 09:11:29

回答

1

我不知道這是否是解決方案,但它似乎穩定:

Preventing CSRF With Ajax

+0

我已經閱讀了文章,但它似乎解決了json發佈問題... – 2011-12-19 11:13:02

0

你可以通過調用你的剃鬚刀視圖中下面的函數生成定製防僞標記。

@functions{ 
    public string GetAntiForgeryToken() 
    { 
    string cookieToken, formToken; 
    System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken); 
    return cookieToken + ":" + formToken; 
    } 
} 
<script> 
$.ajax({ 
    type: "POST", 
    url: 'xxx', 
    data: data, 
    headers: { '__RequestVerificationToken': GetAntiForgeryToken()}, 
    success: function (data) { 
    //if success 
    }, 
    error: function (e) { 
    //if error 
    } 
}); 
</script> 

現在你的屬性過濾器內,你可以使用下面的代碼驗證它:

string tokenValue = request.Headers["__RequestVerificationToken"]; 
if (!String.IsNullOrEmpty(tokenValue)) 
{ 
    string[] tokens = tokenValue.Split(':'); 
    if (tokens.Length == 2) 
    { 
     cookieToken = tokens[0].Trim(); 
     formToken = tokens[1].Trim(); 
    } 
} 
System.Web.Helpers.AntiForgery.Validate(cookieToken, formToken);