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

在Swagger中使用ValidateAntiForgeryToken遇到的接口调用异常问题

解决Swagger调用带[ValidateAntiForgeryToken]接口失败的问题

我之前也踩过这个坑,问题根源很清晰:[ValidateAntiForgeryToken]特性要求请求必须携带有效的防伪令牌才能通过验证,但Swagger UI默认不会自动处理这个令牌的获取和传递,所以一旦加上这个特性,接口调用就会因为验证失败抛出异常。

下面给你两种实用的解决方案,按需选择:

方案1:让Swagger支持防伪令牌验证(推荐用于需要在开发环境也验证的场景)

这个方案会配置Swagger自动读取防伪令牌并添加到请求头,完整步骤如下:

  1. 配置防伪验证的Cookie和Header名称
    在Program.cs(或Startup.cs)里,配置Antiforgery服务,指定Cookie和Header的名称,确保Swagger能正确识别:
builder.Services.AddAntiforgery(options =>
{
    options.HeaderName = "X-XSRF-TOKEN"; // 请求头里的令牌名称
    options.Cookie.Name = "XSRF-TOKEN"; // 存储令牌的Cookie名称
});
  1. 给Swagger添加安全定义和要求
    在Swagger的配置中,添加对应的安全方案,让Swagger UI知道需要传递这个令牌:
builder.Services.AddSwaggerGen(c =>
{
    // 你的其他Swagger配置(比如文档信息)...
    
    // 定义XSRF令牌的安全方案
    c.AddSecurityDefinition("XSRF-TOKEN", new OpenApiSecurityScheme
    {
        Type = SecuritySchemeType.ApiKey,
        Name = "X-XSRF-TOKEN",
        In = ParameterLocation.Header,
        Description = "从Cookie获取的XSRF令牌,用于防伪验证"
    });

    // 给所有接口添加这个安全要求
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "XSRF-TOKEN"
                }
            },
            Array.Empty<string>()
        }
    });
});
  1. 配置Swagger UI自动读取Cookie中的令牌
    最后,在Swagger UI的配置里添加一个请求拦截器,自动从Cookie中提取令牌并添加到请求头:
app.UseSwaggerUI(c =>
{
    // 你的其他Swagger UI配置(比如端点地址)...
    
    // 添加请求拦截器,自动注入XSRF令牌
    c.ConfigObject.AdditionalItems["requestInterceptor"] = @"() => {
        return {
            requestInterceptor: (req) => {
                // 从Cookie中提取XSRF-TOKEN
                const tokenMatch = document.cookie.match(/XSRF-TOKEN=([^;]+)/);
                const token = tokenMatch ? tokenMatch[1] : '';
                if (token) {
                    req.headers['X-XSRF-TOKEN'] = token;
                }
                return req;
            }
        };
    }";
});

完成这些配置后,Swagger会自动处理防伪令牌的传递,你就能正常调用带[ValidateAntiForgeryToken]的接口了。

方案2:开发环境跳过防伪验证(适合快速测试)

如果只是开发阶段用Swagger测试,不想启用防伪验证,可以给验证逻辑加环境判断,只在生产环境生效:

方式A:在Action里手动判断

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
{
    // 非开发环境才验证防伪令牌
    if (!Environment.IsDevelopment())
    {
        await HttpContext.ValidateAntiForgeryTokenAsync();
    }

    Console.WriteLine("IN 1");
    // 你的其他业务代码...
}

这样配置后,开发环境下Swagger调用接口不会触发防伪验证,生产环境依然会保持验证逻辑的安全性。

内容的提问来源于stack exchange,提问作者Kirsten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:08