我正在开发一个项目,需要在 ASP.NET Core 中通过 jQuery Ajax 发送帖子。
$.ajax({
url: _url,
headers: {
[tokenheadername]: token
},
type: 'POST',
data: _data,
success: function (r) { location.reload(); },
error: function (XMLHttpRequest, textStatus, errorThrown) {
swal('Error', 'Cannot update entry!' + XMLHttpRequest.status, 'error');
},
});
控制器操作具有 [ValidateAntiForgeryToken] 属性,
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin,Manager,User")]
public async Task<IActionResult> UpdateEntry(Guid id,string filepath,string originalfilename, bool isvideo)
{
...
return Ok();
}
以下是启动文件中的防伪设置:
services.AddAntiforgery(options =>
{
options.HeaderName = "__RequestVerificationToken";
options.Cookie.Name = Configuration["domain"];
});
它在我的本地开发调试环境中运行得很好。然而它在产品上失败了。产品应用程序位于 submain 中。 错误代码是 400。
非常感谢您的帮助。
我知道这是一篇较旧的帖子,但也许尝试更改您的 Ajax 调用以使用
beforeSend: function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input[name=__RequestVerificationToken]').val()); }
。 如果 __RequestVerificationToken 为空,您可能还需要将 @Html.AntiForgeryToken()
添加到您的视图中。
如果是.NET6 之前的版本,请更新您的startup.cs 文件以具有
services.AddAntiforgery(options => { options.HeaderName = "XSRF-TOKEN"; });
。 如果是 .NET 6 或更高版本,请将此代码添加到 program.cs 文件中。
注意:如果仍然出现错误,可能在开发时使用Visual Studio中的“IIS Express”。 在 Kestrel 下执行应用程序时,我们发现了细微的差异。 IIS Express 可能会向您显示在代码的产品发布版本中遇到的错误。