【发布时间】:2020-11-02 11:11:28
【问题描述】:
这个主题有很多类似的问题,但没有一个能解决我今天面临的具体问题。
受影响的环境是:
- ASP.NET Core 3.1 Web 应用(v3.1.9 运行时)
- Ubuntu Server v20.04 Focal
- Nginx Web 服务器 (v1.18.0) 配置为 Kestrel 的代理通道
使用 jQuery 发出 Ajax POST 时会出现此问题(其他 JS 框架也失败),该问题会达到 400 - 由于 Antiforgerytoken 未正确验证而导致的错误请求。
此问题与 Antiforgery 令牌丢失无关,因为它也以适当的方式正确添加到 Ajax 调用标头字段和/或表单字段:
@inject IAntiforgery antiforgery
@{
var tokenSet = antiforgery.GetAndStoreTokens(Context);
}
[...]
$.ajax({
headers: {
"@tokenSet.HeaderName": "@tokenSet.RequestToken"
},
data: {
"@tokenSet.FormFieldName": "@tokenSet.RequestToken"
},
[...]
});
上述设置 Antiforgery 令牌的模式被证明工作正常,以至于当直接访问 Kestrel 时,调用在开发甚至生产中都被接受(如果不涉及 Nginx,则不会出现 400 错误)。
事实上,这个问题似乎与这个特定的 Nginx 问题有关:
在第一个线程中还有一个解决方法,它依赖于以下 Nginx 设置:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
很遗憾,建议的解决方法对我不起作用。
有什么线索吗?
更新:我最终设法解决了这个问题。问题与我在标题名称和 cookie 名称中都有一个点有关:
services.AddAntiforgery(options => {
options.Cookie.Name = "X-CSRF-TOKEN-MyApp.Namespace";
options.HeaderName = "X-CSRF-TOKEN-MyApp.Namespace";
});
这足以削弱一切。感谢 Mike Bogolepov 的回答,问题不是他建议的下划线,但该建议仍然足以为我指明正确的方向:谢谢!
【问题讨论】:
标签: jquery ajax asp.net-core nginx antiforgerytoken