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

Angular13搭配ASP.NET Core5使用ValidateAntiForgeryToken始终报400错误

可行解决方案
  • 修复CORS配置的凭证兼容问题
    你当前使用的AllowAnyOrigin()CORS配置和带凭证(Cookie、HTTP认证信息)的请求完全不兼容,浏览器会自动拦截这类请求,同时ASP.NET Core防伪校验也会拒绝无明确来源的请求。修改配置如下:
services.AddCors(c =>
{
    c.AddPolicy("AllowOrigin", options => 
        options.WithOrigins("https://tenant1.example.com", "https://tenant2.example.com") // 把所有租户子域名都加进来,也可以用正则匹配批量添加子域
               .AllowAnyHeader()
               .AllowAnyMethod()
               .AllowCredentials()); // 必须添加此行允许携带凭证
});

// 中间件部分直接引用定义好的策略名即可,无需重复写配置
app.UseCors("AllowOrigin");

控制器上的[EnableCors(PolicyName = "AllowOrigin")]特性保持不变。

  • 配置防伪Cookie适配多租户子域名
    默认防伪Cookie只会绑定到签发它的子域名,其他子域名无法读取/携带该Cookie,直接导致令牌校验失败。修改防伪配置,把Cookie绑定到父域名:
services.AddAntiforgery(options =>
{
    options.Cookie.Name = "XSRF-TOKEN";
    options.HeaderName = "X-XSRF-TOKEN";
    options.Cookie.HttpOnly = false;
    options.Cookie.Domain = ".example.com"; // 替换为你的主域名,开头加.适配所有子域名
    // 开发环境可以保留以下配置,生产环境开启HTTPS后可改为SameSiteMode.None
    options.Cookie.SameSite = SameSiteMode.Lax;
});

同时修改你自定义的XSRF令牌下发中间件,Cookie参数中同步添加域名配置:

context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
    new CookieOptions() { 
        HttpOnly = false, 
        Secure = false, // 生产环境改为true
        Domain = ".example.com", // 和上文配置保持一致
        SameSite = SameSiteMode.Lax 
    });
  • 调整中间件执行顺序
    确保中间件顺序严格按照如下优先级排列,顺序错误会直接导致校验失效:
// 1. 最先放置CORS中间件
app.UseCors("AllowOrigin");
// 2. 然后放置你自定义的XSRF令牌下发中间件
app.Use(next => context => { /* 你的自定义逻辑 */ });
// 3. 再放置路由、认证、授权等其他中间件
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
  • 补充Angular端配置确认
    确保你在app.module.ts中已经导入了XSRF适配模块:
import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http';

@NgModule({
  imports: [
    HttpClientModule,
    // 加入以下配置,和后端配置的Cookie、Header名对应
    HttpClientXsrfModule.withOptions({
      cookieName: 'XSRF-TOKEN',
      headerName: 'X-XSRF-TOKEN',
    }),
  ]
})
  • 错误排查技巧
    如果仍有问题,在appsettings.json中开启防伪服务的调试日志,即可查看具体的校验失败原因:
{
  "Logging": {
    "LogLevel": {
      "Microsoft.AspNetCore.Antiforgery": "Debug"
    }
  }
}

内容的提问来源于stack exchange,提问作者Kyrolus Kamal Fahim Sous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:54:08