.NET Core 3.0:授权处理器重定向与RouteEndpoint返回RedirectToActionResult方法
解决方案:.NET Core 3.0 路由端点重定向与授权失败重定向问题
问题1:RouteEndpoint 如何返回 RedirectToActionResult?
在 .NET Core 3.0 中,RouteEndpoint 属于底层路由系统组件,本身并不直接返回 ActionResult 类型(比如 RedirectToActionResult)。如果需要重定向到指定控制器的 action,你可以按以下方式实现:
- 首先确保能访问到
HttpContext:可以通过依赖注入IHttpContextAccessor,或者在中间件/授权处理器中直接获取。 - 使用
IUrlHelper生成目标 action 的完整 URL,避免硬编码路径:var urlHelperFactory = _serviceProvider.GetRequiredService<IUrlHelperFactory>(); var actionContext = new ActionContext( _httpContextAccessor.HttpContext, _httpContextAccessor.HttpContext.GetRouteData(), new ControllerActionDescriptor() ); var urlHelper = urlHelperFactory.GetUrlHelper(actionContext); var targetUrl = urlHelper.Action("Error", "Shared"); - 最后通过
HttpContext.Response执行重定向:_httpContextAccessor.HttpContext.Response.Redirect(targetUrl);
如果是在控制器内部处理相关逻辑,直接返回 RedirectToActionResult 即可,和传统 MVC 用法一致:
return RedirectToAction("Error", "Shared");
问题2:授权处理器中认证失败重定向至错误页面
.NET Core 3.0+ 中,AuthorizationHandlerContext.Resource 的类型从 AuthorizationFilterContext 改为了 Endpoint,导致你原来的代码失效。这里利用你已注入的 IHttpContextAccessor 就能解决问题,修改后的代码如下:
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CheckADGroupRequirement requirement) { // 替换为你的实际用户认证判断逻辑 if (wi.IsAuthenticated) { context.Succeed(requirement); } else { var httpContext = _httpContextAccessor.HttpContext; if (httpContext != null) { // 重定向到错误页面 httpContext.Response.Redirect("/Shared/Error"); // 标记授权失败,阻止后续管道执行 context.Fail(); } } return Task.CompletedTask; }
需要注意这几点:
- 调用
context.Fail()明确标记授权失败,ASP.NET Core 会停止后续的授权检查和请求处理。 - 确保
IHttpContextAccessor已在Startup.cs中注册:services.AddHttpContextAccessor(); - 如果错误页面基于 MVC 控制器,建议用
IUrlHelper生成 URL,避免路由配置变化导致路径失效。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

