【问题标题】:AutoValidateAntiforgeryToken always causing 400 Bad Request to returnAutoValidateAntiforgeryToken 总是导致 400 Bad Request 返回
【发布时间】:2018-09-21 22:40:11
【问题描述】:

我希望在我的 .NET Core 2 API 中使用 XSRF 令牌。 我正在使用 Vue.Js 前端。

我已按照此处的说明正确配置了后端: https://stackoverflow.com/a/44035774/2027404

登录后,我创建了一个名为“XSRF-TOKEN”的 cookie,并在 Vue 中编写了一个拦截器来模仿 AngularJS 的功能,它会查找 cookie 并附加带有标题“X-XSRF-TOKEN”的 XSRF 令牌" 到受 [AutoValidateAntiforgeryToken] 保护的控制器路由 属性。

以下是在持久化 cookie 并完成登录后发出的 Post 请求的示例跟踪:

POST /api/auth/Test HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Content-Length: 0
Origin: http://localhost:5000
X-XSRF-TOKEN: CfDJ8Ku5qKiYnPBCmHLFQRR3pGmv482utwpDs1AssvvtQ1yf2eGgasNE4DOTdxivPLqv5e4TGuG800elYMFyJqTC7bzOfnY0HVCUD-Dw0pn-bkBZeN2GjBBvqMJ79Vcwun4khLe9qlzxyBTB0W1XEu_OJq0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36
Content-Type: application/json;charset=utf-8
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
Referer: http://localhost:5000/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: XSRF-TOKEN=CfDJ8Ku5qKiYnPBCmHLFQRR3pGmv482utwpDs1AssvvtQ1yf2eGgasNE4DOTdxivPLqv5e4TGuG800elYMFyJqTC7bzOfnY0HVCUD-Dw0pn-bkBZeN2GjBBvqMJ79Vcwun4khLe9qlzxyBTB0W1XEu_OJq0

因此,真正的重点是证明不仅发送了我的 cookie,而且还包括了我的 Startup.cs 所期望的标头。

        public void ConfigureServices(IServiceCollection services) {
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => {
                options.TokenValidationParameters = new TokenValidationParameters {
                ValidateIssuer = true,
                ValidIssuer = Configuration["JWT:Issuer"],

                ValidateAudience = true,
                ValidAudience = Configuration["JWT:Audience"],

                ValidateIssuerSigningKey = true,

                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:SecretKey"])),

                ValidateLifetime = true
                };
            });

        services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
        services.AddMvc();
}

我的控制器方法如下:

        [HttpPost ("[action]")]
    //[Authorize]
    [AutoValidateAntiforgeryToken]
    public IActionResult Test () {
        return Ok ("Working fine!");
    }]

我绝对不会做任何愚蠢的事情,比如指向错误的路线。如果我禁用 AVAT 并将 Authorize 与 JWT 一起使用(我的目标是最终同时使用 JWT 和 XSRF 来使用双 cookie 方法来确保安全),我可以获得 200 响应,前提是我在我的请求头...

关于为什么这个现成的功能没有发挥作用有什么想法吗?总是返回 400...

我可以展示更多源代码,但证明在请求跟踪中的布丁中......应该需要的所有数据都在那里。

谢谢

【问题讨论】:

  • 您实际上并未发布任何表单数据。该表单将包含一个 __RequestVerificationToken 字段,用于验证请求。
  • 我不想发布表单数据,因为我提到的另一个 Stack Overflow 链接指定所采取的步骤也适用于 API,并可用于 SPA。或者您的意思是向我的 post 端点添加一个参数会提供所谓的“表单数据”?

标签: c# .net asp.net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

问题解决了。

确保使用 IAntiforgery.GetAndStoreTokens(HttpContext) 方法不仅为您提供 XSRF 令牌,而且最重要的是存储 .NET Core 默认使用这种身份验证形式期望的 AspNetCore.Antiforgery 令牌。

我只在上面的链接堆栈溢出帖子中使用 IAntiforgery.GetTokens(HttpContext),虽然它允许我获取我的 XSRF 令牌并将其附加到我的标题中,但我错过了防​​伪 cookie。

【讨论】:

  • 先生,您能否说明您采取了哪些措施来解决这个问题?我也遇到了同样的问题。
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2023-01-12
  • 2021-11-04
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多