Asp.net-Mvc
發佈到 Razor 頁面時出現 400 錯誤請求
我的頁面有…
@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>