.NET Core Razor Page ajax请求返回400 Bad request
Razor页面被设计为默认启动防跨站请求伪造攻击的,防伪令牌生成和验证被自动包含在Razor页面中。
打开页面可以看到表单里有一个隐藏的input
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8JOahXSw05tKp2_4iLUJCzMYUFLeMGC-YtsK1ulbUapsD3ee0F0P7aZO1t7CmRHpOugTxUyhtcsIGtcdShW0k7cfA-dTHjTw2TPRDGU1PGnxGxIl39RWCeMGvswAhToLPfBBmkUUTkS3x4eFFTbIO_Y">
那么在ajax请求的时候应该把这个input的一起提交,示例如下:
<script>
$('#ajax').click(function () {
$.ajax({
type: "POST",
url: "",
beforeSend: function (xhr) { },
data: { __RequestVerificationToken: $('input:hidden[name="__RequestVerificationToken"]').val() },
success: function (response) { console.log(response); }
});
});
</script>
这样就能Post成功了。
可以全局禁用掉防伪令牌验证,在Startup.cs中修改如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorPagesOptions(o=>
{
o.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
}).InitializeTagHelper<FormTagHelper>((helper, context) => helper.Antiforgery = false);
}
这样请求的时候就不会检查防伪令牌了,并且form表单里也不会出现隐藏的input了。
也可以对部分页面禁用防伪令牌验证,两种方法如下:
1 在Startup类的ConfigureServices方法进行配置,不过要提供页面的路径:
public void ConfigureServices(IServiceCollection services)
{
//或者services.AddMvc().AddRazorPagesOptions...
services.AddRazorPages().AddRazorPagesOptions(opotions =>
{
opotions.Conventions.AddPageApplicationModelConvention("/Index1",
pageApplicationModel => pageApplicationModel.Filters.Add(new Microsoft.AspNetCore.Mvc.IgnoreAntiforgeryTokenAttribute()));
});
}
在此处,我们禁用了Index页面的防伪令牌验证。
2 在PageModel上面使用标记:
[IgnoreAntiforgeryToken(Order = 1001)]
public class IndexModel : PageModel
{
public void OnPost()
{
}
}
ValidateAntiForgeryToken标记默认的Order属性为1000,因此IgnoreAntiforgeryToken属性需要一个更高的序号。
改完之后再通过ajax请求的时候也不会返回400错误了,但是我们发现页面上还是会自动加入这个隐藏的input,如何解决呢?
禁用防伪令牌验证不会阻止生成隐藏字段或cookie,所以需要禁用FormTagHelper生成令牌。
<form method="post" asp-antiforgery="false"></form>
这样就不会有这个隐藏的input了。
更新于:3个月前相关文章
- .NET C# 使用Hook钩子实现全局监听键盘和鼠标
- BotSharp 基于 .NET 平台的开源 AI 聊天机器人框架
- .NET C#连接FTP实现文件上传下载
- ABP.Net Core使用教程(一)启动模版项目
- .NET C#中的Func、Predicate和Expression用法详解
- 5个高性能 .NET Core 图片处理库推荐
- ASP.NET如何将Views文件夹从项目分离
- .NET C# 读取编辑.AVIF图片文件
- .NET C# SkiaSharp读取.AVIF图片文件报错
- .NET开源ORM FreeSql常见问题和解决方法
- 微软于发布了.NET 9 Release Candidate 2 提高整体质量
- 分享5个开源的.NET Excel读写操作库
- .Net Core中Dapper的使用详解
- ASP.NET 使用Entity Framework (EF) 创建迁移修改SQLite数据库表结构
- 如何从.NET Framework迁移到.NET Core或.NET 6/7?
- 如何优化ASP.NET Core应用的性能?
- 10款.NET开发中推荐的代码分析和质量工具
- .NET9 Blazor有哪些更新?
- 在Docker、Kubernetes环境下部署.NET应用的最佳实践
- .NET 游戏开发框架有哪些?