簡體   English   中英

在.Net Core 3.1 上啟用 antiForgery 會導致 BadRequest

[英]Enabling antiForgery on .Net Core 3.1 results in BadRequest

我正在嘗試實現 .net Core 3.1 框架中提供的防偽機制,但是在嘗試發送需要驗證的請求時,我總是收到 400 Bad Request。 該應用程序是使用 Odata、實體框架、Oracle 的 web api。 它使用 JWT 進行身份驗證和授權。 它目前按預期工作,但我被要求將 JWT 保存在 cookie 中,因此我需要針對 XSRF 攻擊實施某種安全措施。

我知道這似乎是一個重復的問題,但我認為我已經遵循了我遇到的每個建議的答案,但無濟於事。

在 ConfigureServices 我有

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());
        });

我有一個允許用戶登錄的專用端點,它會生成軟件所需的 cookies,包括防偽 cookies(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 時,我可以登錄並獲得 cookies。 我可以成功發出 GET 請求,但每次嘗試執行需要 antiForgeryValidation 的 POST 請求時,我都會收到 400 Bad Request 響應。 如果我禁用特定 POST 端點的驗證,則該端點可以正常工作。

在每個請求中,我設置 header X-XSRF-TOKEN 並且我分配給它的值等於 XSRF-TOKEN 的值。 就像是

CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA

postman 中的請求如下所示:

郵遞員請求

當做這樣的請求時,我可以在 context.Request 中看到令牌(所有 4 個 cookies,包括 X-XSRF-TOKEN 和值,這是我在 PostMan 中設置的)

我完全糊塗了,這個實現似乎特別容易,但我無法正確地做到這一點。 請幫忙。

我的錯誤是嘗試登錄並在單個請求中“一次性”設置防偽 cookie。 一旦我在一個請求中登錄並在另一個請求中設置 cookies,一切都按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM