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
相关产品推荐
相关产品推荐

