在 .Net Core 3.1 上启用 antiForgery 导致 BadRequest

Enabling antiForgery on .Net Core 3.1 results in BadRequest

我正在尝试实施 .net Core 3.1 框架中提供的防伪造机制,但是在尝试发送需要验证的请求时,我总是收到 400 Bad Request。该应用程序是一个使用 Odata、Entity Framework、Oracle 的 Web api。它使用 JWT 进行身份验证和授权。它目前按预期工作,但我被要求将 JWT 保存在 cookie 中,因此我需要实施某种针对 XSRF 攻击的安全措施。

我知道这似乎是一个重复的问题,但我想我已经遵循了我遇到的所有建议答案,但无济于事。

在我的配置服务中

services.AddCors(c =>
        {
            c.AddPolicy("AllowOrigin", options => options
                //.AllowAnyOrigin()
                .WithOrigins("https://localhost:5001") 
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials()
                );
        });

        services.AddAntiforgery(options =>
        {
            // Set Cookie properties using CookieBuilder properties†.
            options.HeaderName = "X-XSRF-TOKEN";
            options.SuppressXFrameOptionsHeader = false;
            //options.Cookie.Name = "XSRF-TOKEN";
        });

        services.AddMvc(o =>
        {
            o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
        });

我有一个专用端点,允许用户登录并生成软件所需的 cookie,包括防伪 cookie(XSRF-TOKEN 和 .AspNetCore.Antiforgery.IwdqSLfpWIs)

var aft = _antiForgery.GetAndStoreTokens(HttpContext);
                Response.Cookies.Append("XSRF-TOKEN", aft.RequestToken, new CookieOptions
                {
                    HttpOnly = false
                    //,IsEssential = true
                    ,Secure = true
                    //TODO: Varias de entorno
                    ,Domain = "localhost"
                });

使用 postman 时,我可以登录并获取 cookie。我可以成功发出 GET 请求,但每次我尝试执行需要 antiForgeryValidation 的 POST 请求时,我都会收到 400 Bad Request 响应。如果我禁用特定 POST 端点的验证,则此类端点可以正常工作。

在每个请求中,我设置 header X-XSRF-TOKEN 并且我分配给它的值等于 XSRF-TOKEN 的值。像

CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA

邮递员中的请求看起来像这样:

当执行这样的请求时,我可以在 context.Request 中看到令牌(所有 4 个 cookie,包括 X-XSRF-TOKEN 和值,这是我在 PostMan 中设置的)

我很困惑,这个实现看起来特别容易,但我做不好。请帮忙。

我的错误是试图在单个请求中“一次性”登录并设置防伪 cookie。一旦我在一个请求中登录并在另一个请求中设置 cookie,一切都按预期进行。