.NET Core 3.0中UseStatusCodePages系列中间件403错误页配置问题
解决.NET Core 3.0 MVC中AD授权场景下的403自定义错误页异常问题
我之前也踩过类似的.NET Core MVC结合Active Directory授权时的自定义错误页配置坑,正好和你的场景完全匹配,来给你梳理下问题和最终的解决思路:
问题背景
你当前基于.NET Core 3.0 MVC构建的应用,用AD做认证授权,已经配置了UseStatusCodePagesWithReExecute中间件:
- 访问不存在的URL时,自定义404错误页能正常显示
- 但访问带有
[Authorize(Role="Admin")]特性的控制器/Action时,403错误页出现了三种异常情况:- 使用
UseStatusCodePages()时,403错误显示空白默认页 - 使用
UseStatusCodePagesWithRedirects()时,出现「localhost重定向次数过多」的错误 - 使用
UseStatusCodePagesWithReExecute()时,403错误跳转到通用拒绝页而非你自定义的页面
- 使用
另外你提到:Home控制器带有Authorize特性,但它的StatusCode Action加了AllowAnonymous;不需要处理401错误(IIS已有企业自定义页),只需要自定义403拒绝页告知用户联系相关人员。
已验证的解决方案
通过在Configure方法中添加针对403状态码的单独重定向逻辑,再结合UseStatusCodePagesWithReExecute处理其他状态码的重执行,就能完美解决这个问题。修改后的核心配置片段如下:
if (CurrentEnvironment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } // 针对403状态码单独处理重定向 app.UseStatusCodePages(async context => { if(context.HttpContext.Response.StatusCode == 403) { context.HttpContext.Response.Redirect("/Home/StatusCode?statusCode=403"); } }); // 其他状态码使用重执行逻辑 app.UseStatusCodePagesWithReExecute("/Home/StatusCode", "?statusCode={0}");
方案说明
单独给403做重定向的原因是:直接用UseStatusCodePagesWithReExecute处理403时,由于授权流程的上下文残留,会导致框架跳转到默认的通用拒绝页;而单独拦截403状态码做重定向,就能绕过这个问题,确保跳转到你自定义的页面,同时其他状态码依然可以用UseStatusCodePagesWithReExecute的重执行逻辑来处理,保证整体错误页的一致性。
内容的提问来源于stack exchange,提问作者Sudonim
相关产品推荐
相关产品推荐

