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

ASP.NET Core MVC中Ajax调用受[Authorize]保护的控制器方法问题

解决Ajax调用带[Authorize]的ASP.NET Core MVC Post方法问题

Cookie认证机制下,浏览器默认会自动在同域名的Ajax请求中携带认证Cookie,所以无需手动传递Cookie。你的Post方法未被调用,核心原因大概率是ASP.NET Core默认启用的防跨站请求伪造(CSRF)验证拦截了请求,而非认证Cookie缺失。

问题分析

ASP.NET Core MVC中,所有POST请求默认触发Antiforgery验证,若请求未携带有效CSRF令牌,服务器会直接拒绝请求(返回400或403状态码),导致DoSomething方法根本不会执行。

解决方案

1. 在视图中生成CSRF令牌

在你的视图页面里添加CSRF令牌的隐藏字段:

@Html.AntiForgeryToken()

2. 修改Ajax请求,携带CSRF令牌

更新JavaScript代码,将CSRF令牌放入请求头:

$(document).ready(function () {
    $('#btnDoSomething').click(function () {
        // 获取页面中的CSRF令牌
        var token = $('input[name="__RequestVerificationToken"]').val();
        
        $.ajax({
            url: "/Home/DoSomething",
            type: "POST",
            cache: false,
            async: true,
            // 把CSRF令牌添加到请求头
            headers: {
                "RequestVerificationToken": token
            },
            success: function (data) {
                alert(data);
            },
            error: function(xhr) {
                // 调试用:查看请求失败的状态码和详情
                console.log("请求失败,状态码:" + xhr.status);
                console.log("响应内容:" + xhr.responseText);
            }
        });
    });
});

3. 可选:显式指定验证特性(按需)

如果你的控制器未继承默认的Controller基类,可在方法上手动添加[ValidateAntiForgeryToken]特性(继承Controller的话默认已启用,无需额外添加):

[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public string DoSomething()
{
    return "DoSomething";
}

额外排查方向

  • 确认用户已通过Cookie认证登录:打开浏览器开发者工具的「Application」标签,检查对应域名下是否存在认证Cookie(默认名称通常为.AspNetCore.Identity.Application)。
  • 查看网络请求状态:若返回401,说明认证Cookie无效或未携带;若返回400/403,基本是CSRF令牌问题。
  • 跨域场景处理:如果请求是跨域的,后端需配置CORS并启用WithCredentials(),同时前端Ajax要添加xhrFields: { withCredentials: true }参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:13:12