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

