【问题标题】:ASP.NET Core + Antiforgery + jQuery Ajax POST + Nginx - 400 Bad RequestASP.NET Core + Antiforgery + jQuery Ajax POST + Nginx - 400 错误请求
【发布时间】: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


    【解决方案1】:

    根据我遇到同样问题的经验,我想假设:

    首先,您的应用程序是否使用 Aspnet Core DataProtection ? https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-3.1。错误的验证可能与此有关。

    其次,我们有一个带下划线的标头,nginx 将其从请求中切出到 Kestrel。 http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers。如果您在生产中使用带有 ingress 的 k8s:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#enable-underscores-in-headers。

    您是否在 Startup.cs(AddAntiforgery() 方法)中覆盖标头名称或将其设为空?

    【讨论】:

    • 我在标题名称和表单字段名称中有一个点,这基本上使他们两个都瘫痪了:你的“下划线”建议足以为我指明正确的方向,最后我设法解决了这个问题问题:谢谢!
    猜你喜欢
    • 2020-10-12
    • 2018-10-08
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多