AutoValidateAntiforgeryToken始终导致400 Bad Request返回

时间:2018-04-11 22:32:17

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

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

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

登录后,我创建了一个名为" XSRF-TOKEN"我已经在Vue中编写了一个拦截器来模仿AngularJS的作用,它会查找cookie并在XSRF标记上添加标题" X-XSRF-TOKEN"到受[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并使用授权代替JWT(我的目标是最终同时使用JWT和XSRF以使用双cookie方法来保证安全性),我可以获得200响应,前提是我提供了有效的身份验证承载我的请求标题中的令牌......

任何关于为什么这个袋子功能不打球的想法?总是返回400 ...

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

由于

1 个答案:

答案 0 :(得分:0)

问题解决了。

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

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