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

时间:2021-04-01 19:47:11

标签: c# asp.net-core antiforgerytoken

我正在尝试实现 .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 端点的验证,则该端点可以正常工作。

在每个请求中,我都设置了标头 X-XSRF-TOKEN,我分配给它的值等于 XSRF-TOKEN 的值。类似的东西

CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA

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

PostManRequest

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

我很困惑,这个实现似乎特别容易,但我无法正确地做到这一点。请帮忙。

1 个答案:

答案 0 :(得分:0)

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

相关问题