3

我在使用Marionette &主幹使用單頁面應用程序(SPA)編寫的單頁應用程序(MMO)使Microsoft MVC的[ValidateAntiForgeryToken]工作時出現問題。問題似乎是MVC [ValidateAntiForgeryToken]方法無法看到我們作爲JSON的一部分發送的令牌。我們認爲這是因爲令牌必須位於回覆的表格部分,但MrOggy85表示這不是問題(請參閱下面的答案)。如何使用骨幹單頁應用程序測試MVC4中的AntiForgeryToken

該代碼是在我的api控制器,它使用AttributeRouting,我們認爲這是導致問題。一個典型的動作如下所示:

// POST api/vizschemes/ 
    [POST("")] 
    [Authorize(Roles = "...some role...")] 
    [ValidateAntiForgeryToken] 
    public ActionResult Add(CreateUpdateSmVizSchemeDto dto, ICreateSmVizScheme service) 
    { 
     ... code to update the VizScheme and return json 
    } 

有沒有其他人克服了這個問題?大量的谷歌搜索引發了評論postASP.NET MVC通過AntiForgery類和[ValidateAntiForgeryToken]屬性提供了對防僞令牌的內置支持。目前,這個功能並沒有內置到Web API中。但是,(KnockoutJS)模板包含Web API的自定義實現。「。這表明他們自己寫,我可以做。

有沒有人打過這個,如果是的話你是如何解決它的?我錯過了一些明顯的東西,還是應該編寫自己的ValidateAntiForgeryToken方法?您的意見將不勝感激。通過@ MrOggy85在它大量的詳細信息提供

UPDATE

GREAT計算器的鏈接。請參閱How can i supply an AntiForgeryToken when posting JSON data using $.ajax?。我打算編寫自己的AntiForgery測試,並在完成後發佈。

回答

0

我不知道AntiForgery,但Backbone可以配置爲emulate RESTemulate JSON來繞過服務器的這種限制。

Backbone.emulateHTTP = true; 
Backbone.emulateJSON = true; 

這會告訴骨幹只使用POST方法delete()update()和發送的數據作爲application/x-www-form-urlencoded而不是application/json

+0

嗨@mor,謝謝你。我的問題是處理MVC [ValidateAntiForgeryToken],如果我在MVC中使用標準方法,則需要所有數據作爲表單提交返回。問題是,我應該改變Backbone來做到這一點,或者在MVC中實現我自己對令牌的檢查。我想知道是否有其他人在使用MVC構建單頁面應用程序時遇到了這個問題,以及他們對此做了什麼。 –

2

當您在一個視圖中使用助手@Html.AntiForgeryToken()這是實際的HTML結果:

<input name="__RequestVerificationToken" type="hidden" 
value="{ long cryptic code }"> 

該輸入字段通常是您<form> - 元素裏面,這意味着,如果你提交,這將是附在請求形成。

如果此輸入字段超出了您的表單或者您未提交表單,則會出現此問題。不用擔心,有這個解決方案。屬性[ValidateAntiForgeryToken]通知服務器查找名稱爲「__RequestVerificationToken」的密鑰。讓我們給服務器它想要的!

首先,得到那個價值!

var antiforgeytoken = $('input[name=__RequestVerificationToken]').val();

其次,它連接到您的AJAX請求(我使用jQuery)

$.ajax({ 
    url: 'something/something', 
    type: 'POST', 
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8', // Default 
    data: { 'somekey': 'someval', 
      '__RequestVerificationToken', antiforgeytoken } 
}); 

現在你的服務器是幸福的,你呢!

更新:
內容類型是因爲MVC粘合劑如何驗證請求重要。如果您想使用另一種內容類型,則此解決方案How can i supply an AntiForgeryToken when posting JSON data using $.ajax?建議在兩個不同的參數中分隔防僞標記和postdata。

+0

嗨@ MrOggy85。我們已經嘗試過您編寫的代碼,並且因「所需的防僞表單字段」__RequestVerificationToken「不存在」而失敗。我們認爲這是因爲令牌不在HttpRequest的表單部分。我們已經驗證了令牌在響應中。 你有上面的代碼在applciation中工作嗎?也許我們錯過了什麼? –

+0

你是否也把[HttpPost]放在動作上了(我有時忘了這麼做......)?是的,我有我的解決方案在一個活動的Web應用程序中工作。 – Giorgio

+0

感謝您輸入MtOggy85,這是非常有用的,但我仍然有問題。至少你已經清除了它不必在請求的表單部分。我更新了我的問題以包含我們在api中的代碼。我只能假設AttributeRouting導致一個問題,但我看不出如何。 –