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

ASP.NET Core 5 MVC 未授权访问JSON接口如何返回401而非跳转登录页

解决方案

方案原理

ASP.NET Core Identity默认使用Cookie身份认证,未授权访问时默认对所有请求执行302跳转到登录页的逻辑,我们可以通过自定义Cookie认证的重定向事件,区分AJAX接口请求和普通页面请求,对AJAX请求直接返回401状态码。

实现步骤

1. 修改身份认证配置

在Program.cs的AddDefaultIdentity配置段后新增Cookie事件配置,修改后的完整服务注册代码如下:

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    // 新增以下Cookie认证行为配置
    .ConfigureApplicationCookie(options =>
    {
        // 自定义未登录重定向逻辑
        options.Events.OnRedirectToLogin = context =>
        {
            // 判断是否为AJAX请求:携带X-Requested-With请求头且值为XMLHttpRequest
            if (context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                context.Response.StatusCode = 401;
                return Task.CompletedTask;
            }
            // 普通页面请求保留原有跳转登录页逻辑
            context.Response.Redirect(context.RedirectUri);
            return Task.CompletedTask;
        };
        // 可选:配置已登录但无权限时的403返回逻辑
        options.Events.OnRedirectToAccessDenied = context =>
        {
            if (context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                context.Response.StatusCode = 403;
                return Task.CompletedTask;
            }
            context.Response.Redirect(context.RedirectUri);
            return Task.CompletedTask;
        };
    });

builder.Services.AddControllersWithViews();

2. 前端请求补充标识头(按需操作)

  • 使用jQuery发起AJAX请求时默认会自动携带X-Requested-With: XMLHttpRequest头,无需额外配置
  • 使用fetch、axios等其他请求库时,需要手动在请求头中添加该标识,fetch示例:
fetch('/你的控制器路径/JsonTest', {
  headers: {
    'X-Requested-With': 'XMLHttpRequest'
  },
  credentials: 'include' // 携带认证Cookie必须加此配置
})

效果验证

修改完成后:

  • 普通浏览器直接访问接口地址,未登录时仍然会302跳转到登录页,不影响原有页面逻辑
  • AJAX请求接口时,未登录会直接返回401状态码,前端可以直接捕获该状态码做对应处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:08