Asp.net-Mvc

發佈到 Razor 頁面時出現 400 錯誤請求

  • January 22, 2018

我的頁面有…

@page "{candidateId:int}"

… 和

@Html.AntiForgeryToken()

模型有…

public void OnGet(int candidateId)
{

}

public void OnPost(int candidateId)
{

}

GET 工作正常。這是我的 AJAX 請求..

$.ajax({
   type: "POST",
   url: "/Skills/" + candidateId,
   beforeSend: function (xhr) {

       xhr.setRequestHeader("XSRF-TOKEN",
           $('input:hidden[name="__RequestVerificationToken"]').val());
   },
   data: {

       name: 'hi mum'
   },

   success: function (response) {
   },
   failure: function (response) {

       alert(response);
   }
});

瀏覽器收到無用的錯誤消息… 400 Bad Request。

我錯過了什麼?

您將收到 400(錯誤請求)響應,因為框架希望將其RequestVerificationToken作為已發布請求的一部分。框架使用它來防止可能的 CSRF 攻擊。如果您的請求沒有此資訊,框架將返回 400 bad request。您目前的程式碼未發送。

將程式碼更改為此

headers:
{
   "RequestVerificationToken": $('input:hidden[name="__RequestVerificationToken"]').val()
},

這將在請求標頭中添加一個帶有鍵的新項目,RequestVerificationToken並且框架在呼叫時不應拋出 400 響應。(假設您的視圖程式碼為隱藏輸入生成了__RequestVerificationToken隱藏輸入)

IAntiforgery您可以通過將實現注入視圖/頁面並使用該GetAndStoreTokens方法來使程式碼更加健壯。

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
   return Xsrf.GetAndStoreTokens(Model.HttpContext).RequestToken;
}
}

並呼叫此GetAntiXsrfRequestToken函式以獲取 javascript 中的值

headers:
{
   "RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},

您可能還想使用 PageModel 的CandidateId屬性來創建 url。像這樣的東西

url: "/Skills/@Model.CandidateId",

此外,您確實需要@Html.AntiForgeryToken()顯式呼叫方法來生成令牌輸入。擁有一個沒有 action 屬性值的帶有 post 方法的表單將為您生成隱藏的輸入。

<form method="post">
  <!-- your inputs-->
</form>

引用自:https://stackoverflow.com/questions/48373229