我有一个 ASP .NET Core 3.1 后端,带有 angular 9 前端(基于 dotnet angular 模板,只是将 angular 更新为 v9)。我使用 cookie 身份验证(我知道 JWT 更适合 SPA,以此作为实验)并且我还在服务器端添加了对 CSRF 保护的支持:
services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN"; // angular csrf header name
});
Run Code Online (Sandbox Code Playgroud)
我有服务器端设置来自动检查 CSRF 使用
options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute())
Run Code Online (Sandbox Code Playgroud)
因此不会根据 CSRF 检查 GET 请求,但会检查 POST。
一开始,angular 应用程序发出 GET 请求以api/init在引导之前获取一些初始数据。在服务器端,此操作按如下方式初始化 CSRF:
// init action body
var tokens = _antiForgery.GetAndStoreTokens(HttpContext);
Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions
{
HttpOnly = false
});
// return some inital data DTO
Run Code Online (Sandbox Code Playgroud)
这按预期工作 - GET …