当 .NET 核心 API 返回带有 XSRF-TOKEN 的响应时,Angular(客户端)未将 XSRF-TOKEN 添加到 cookie

Ami*_*wat 6 .net c# .net-core angular

我正在使用 Angular10 和 .NET 核心 2.2。我已将 Startup.cs 配置为使用 XSRF-TOKEN 返回响应。后端正在返回它,但 Angular 不会将它传递给浏览器的 cookie。

参考微软文档https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-3.1#javascript-ajax-and-spas

Api 用 cookie 返回 XSRF-TOKEN

服务端代码

  // on ConfigureServices
     services.AddAntiforgery(options =>
        {
            options.HeaderName = "X-XSRF-TOKEN";
        });

// on Configure

app.Use(next => context =>
        {
            string path = context.Request.Path.Value;
            if (path != null && path.ToLower().Contains("/api"))
            {
                var tokens = antiforgery.GetAndStoreTokens(context);

                context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
                new CookieOptions() { HttpOnly = false });
            }

            return next(context);
        });
Run Code Online (Sandbox Code Playgroud)

Ami*_*wat 2

就我而言,Angular 不添加 XSRF-TOKEN cookie,因为我为客户端和 API 使用不同的域。

要根据 @David 评论解决此问题,我必须添加withCredentials: true到我的请求中

前任:

this._http.get<Array<string>>(`${environment.config.auth.BASE_API_URL}/Product/GetFeature`, { headers, withCredentials: true});
Run Code Online (Sandbox Code Playgroud)

如果您为客户端 Angular 和服务器(在我的例子中是 asp.net core)使用单个相同的域托管,那么您不需要在客户端添加任何配置,除非您的默认 cookie 名称应该是“XSRF-TOKEN”标头名称应为“X-XSRF-TOKEN”。