You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular与.NET Core实现XSRF时令牌交换错误排查求助

解决Angular + .NET Core XSRF验证时“Cookie与请求Token被交换”的问题

我之前也碰到过一模一样的问题!咱们一步步排查解决:

1. 先检查.NET Core端的AntiForgery核心配置

这个错误大概率是Token的存储或读取逻辑搞反了,首先确认你的AntiForgery配置是否正确匹配前端,并且Cookie的关键属性没设错:

配置示例(.NET 6+ Program.cs)

builder.Services.AddAntiforgery(options =>
{
    // 必须和Angular配置的Cookie名称完全一致
    options.Cookie.Name = "XSRF-TOKEN";
    // 必须和Angular配置的请求头名称完全一致
    options.HeaderName = "X-XSRF-TOKEN";
    // 如果是跨域场景,根据实际调整SameSite,同域用Strict即可
    options.Cookie.SameSite = SameSiteMode.Strict;
    // 生产环境建议开启Secure(HTTPS下生效)
    options.Cookie.Secure = true;
});

关键:StartSession方法的Token输出逻辑

你的StartSession方法里一定要确保Cookie的HttpOnly设为false,因为Angular的HttpClient需要读取这个Cookie来生成请求头,HttpOnly=true的话前端拿不到,必然会出问题:

[HttpGet("startSession")]
public async Task<IActionResult> StartSession()
{
    AntiforgeryTokenSet tokens = _antiforgery.GetAndStoreTokens(HttpContext);
    
    // 重点:HttpOnly必须为false,否则Angular无法读取Cookie
    HttpContext.Response.Cookies.Append(
        "XSRF-TOKEN", 
        tokens.RequestToken, 
        new CookieOptions 
        { 
            HttpOnly = false, 
            Secure = true, 
            SameSite = SameSiteMode.Strict,
            Path = "/" // 确保Cookie在全站有效
        });
    
    return Ok();
}

2. 确认Angular端的XSRF配置

确保HttpClientXsrfModule的参数和.NET端完全匹配,并且HttpClientModule已经正确导入:

配置示例(app.module.ts)

import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http';

@NgModule({
  declarations: [/* ... */],
  imports: [
    HttpClientModule,
    HttpClientXsrfModule.withOptions({
      // 和.NET的Cookie名称一致
      cookieName: 'XSRF-TOKEN',
      // 和.NET的请求头名称一致
      headerName: 'X-XSRF-TOKEN'
    })
  ],
  providers: [],
  bootstrap: [/* ... */]
})
export class AppModule { }

3. 验证请求中的Token是否匹配

用浏览器F12打开Network面板,查看你的POST/PUT/DELETE请求:

  • 检查Request Headers里的X-XSRF-TOKEN值
  • 检查Cookies里的XSRF-TOKEN值
    如果两个值不一致,说明配置的名称可能搞混了;如果其中一个缺失,说明前端没读到Cookie或者后端没正确生成Cookie。

4. 额外注意点

  • Angular的HttpClient只会自动给非GET/HEAD/OPTIONS的请求添加XSRF头,如果是用GET提交数据(不推荐),需要手动设置请求头
  • 跨域场景下,要确保后端允许携带Cookie(CORS配置里的AllowCredentials = true),同时SameSite属性可能需要设为Lax或None(None必须配合Secure=true)

内容的提问来源于stack exchange,提问作者Bob B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:48