ASP.NET Core 3.0:非权限策略用户如何跳转自定义错误页?
解决Windows身份验证下授权失败跳转自定义错误页的问题
看起来你的问题出在几个关键地方,尤其是中间件顺序和Windows身份验证下的授权状态码处理,我来帮你一步步解决:
1. 修正中间件执行顺序(最关键的问题)
你当前把UseAuthorization放在了UseAuthentication前面,这是错误的!ASP.NET Core的中间件是按顺序执行的,必须先完成用户认证,才能进行授权判断。把顺序调整过来:
// 正确的顺序:先认证,再授权,最后处理状态码 app.UseAuthentication(); app.UseAuthorization(); app.UseStatusCodePagesWithReExecute("/Home/ErrorCode/{0}");
之前的顺序会导致授权逻辑无法正确获取用户的身份信息,进而使得状态码页面的处理逻辑失效。
2. 处理Windows身份验证的401拦截问题
Windows身份验证下,当授权失败时默认返回401状态码,但浏览器会自动弹出登录弹窗,不会触发你的自定义错误页。解决这个问题的办法是让授权失败时返回403(禁止访问)状态码,这样就能被UseStatusCodePagesWithReExecute捕获:
修改你的授权策略配置,添加自定义的授权失败处理:
services.AddAuthorization(options => { options.AddPolicy("ADRoleOnly", policy => { policy.RequireAuthenticatedUser(); policy.RequireRole(Configuration["SecuritySettings:ADGroup"], Configuration["SecuritySettings:AdminGroup"]); // 自定义授权失败时的响应状态码 policy.OnAuthorizationFailed = context => { context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden; return Task.CompletedTask; }; }); });
3. 验证自定义错误页的配置
确保你的HomeController的ErrorCode方法路由正确,且对应的视图存在:
- 确认
Views/Home/ErrorCode.cshtml视图已创建,并且能正确显示状态码信息(可以在视图里接收id参数展示,比如添加@model string来显示状态码) - 确保
[AllowAnonymous]特性正确添加,未被其他全局授权策略覆盖
4. 检查AD组配置的正确性
确认appsettings.json里的AD组名称格式正确,在JSON中反斜杠需要转义,所以"MyDomain\\MyADGroup"是正确的(实际解析后为MyDomain\MyADGroup)。你可以在调试时查看User.IsInRole("MyDomain\\MyADGroup")的返回值,确认角色判断逻辑是否正常。
做完这些调整后,不符合角色的用户访问控制器时,应该会被跳转到你的自定义ErrorCode页面,而不是浏览器默认的错误页了。
内容的提问来源于stack exchange,提问作者GreeNSparT
相关产品推荐
相关产品推荐

