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

.NET Core 3.1 Web API JWT认证失败:重定向登录或返回401

解决.NET Core 3.1 Web API JWT认证失败的401返回与React登录页重定向问题

嗨,我来帮你梳理下这个问题——在.NET Core 3.1的Web API里处理JWT认证失败的情况,其实分两种常见场景,我们一个个来看:

场景1:返回401状态码让React客户端处理跳转(推荐)

前后端分离的架构下,后端只负责返回标准的状态码和结构化响应,路由跳转交给前端处理是更合理的做法,这样能让前后端职责更清晰。

你之前的自定义授权属性只设置了状态码,但没有返回结构化的响应内容,前端可能不好判断具体的错误原因。我们可以修改OnAuthorization方法,直接返回包含错误信息的JSON结果:

public class CustomAuthorizeAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var isAuthenticated = context.HttpContext.User.Identity.IsAuthenticated;
        
        if (!isAuthenticated)
        {
            // 构造自定义的API响应结果
            var apiResult = new ApiResult
            {
                Success = false,
                Message = "用户未登录,请先登录"
            };
            
            // 返回401状态码和JSON响应
            context.Result = new JsonResult(apiResult)
            {
                StatusCode = (int)HttpStatusCode.Unauthorized
            };
            return;
        }

        // 这里可以添加你的自定义授权逻辑,比如检查特定Claim、角色等
        var claimsIdentity = context.HttpContext.User.Identity as ClaimsIdentity;
        if (claimsIdentity != null)
        {
            // 示例:检查是否包含特定权限Claim
            var hasPermission = claimsIdentity.HasClaim(c => c.Type == "Permission" && c.Value == "AccessApi");
            if (!hasPermission)
            {
                context.Result = new JsonResult(new ApiResult
                {
                    Success = false,
                    Message = "权限不足,无法访问该接口"
                })
                {
                    StatusCode = (int)HttpStatusCode.Forbidden
                };
            }
        }
    }
}

然后在React客户端,你可以通过请求拦截器(比如用Axios)捕获401状态码,然后跳转到登录页面:

// 在React项目的请求封装里添加响应拦截器
import axios from 'axios';

axios.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response?.status === 401) {
      // 跳转到React的登录路由
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

场景2:后端直接重定向到React登录页(不推荐跨域场景)

如果你的API和React前端部署在同域名下,也可以在后端直接处理重定向,但跨域场景下这种方式会有问题(浏览器会把重定向响应返回给前端,不会自动跳转)。

你之前的UseStatusCodePages代码可以调整为:

app.UseStatusCodePages(async context =>
{
    var response = context.HttpContext.Response;
    if (response.StatusCode == (int)HttpStatusCode.Unauthorized)
    {
        // 填写React登录页的路径,如果是同域名直接写相对路径即可
        response.Redirect("/login");
    }
});

注意事项:

  • 跨域场景下不要用后端重定向,因为浏览器的同源策略会限制这种跳转,还是让前端处理更可靠。
  • 确保你的JWT认证中间件已经正确配置,比如在Startup.cs的ConfigureServices里添加了AddJwtBearer,并且在Configure里启用了UseAuthentication()和UseAuthorization()(注意顺序:UseAuthentication要在UseAuthorization之前)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:52:29