实际上,您不能将 web.config 用于 403 重定向。
您可以做的是覆盖OnActionExecuted
控制器以检查状态代码并重定向到 web.config 中定义的任何内容,如下所示
网络配置:
<customErrors mode="On">
<error statusCode="403" redirect="~/Error/Forbidden" />
</customErrors>
你的家庭控制器
public class HomeController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Response.StatusCode == 403)
{
var config = (CustomErrorsSection)
WebConfigurationManager.GetSection("system.web/customErrors");
string urlToRedirectTo = config.Errors["403"].Redirect;
filterContext.Result = Redirect(urlToRedirectTo);
}
base.OnActionExecuted(filterContext);
}
public ActionResult Edit(int idObject)
{
if(!user.OnwsObject(idObject))
{
Response.StatusCode = 403;
}
return View();
}
}
错误控制器:
public class ErrorController : Controller
{
public ActionResult Forbidden()
{
Response.StatusCode = 403;
return View();
}
}
更通用的解决方案是创建一个可以应用于控制器或单个操作的操作过滤器:
public class HandleForbiddenRedirect : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Response.StatusCode == 403)
{
var config = (CustomErrorsSection)
WebConfigurationManager.GetSection("system.web/customErrors");
string urlToRedirectTo = config.Errors["403"].Redirect;
filterContext.Result = new RedirectResult(urlToRedirectTo);
}
base.OnActionExecuted(filterContext);
}
}
现在您可以将操作过滤器应用于控制器,以便所有操作都重定向到 403
[HandleForbiddenRedirect]
public class HomeController : Controller
{
//...
}
或者在 403 上进行单独的操作重定向
public class HomeController : Controller
{
[HandleForbiddenRedirect]
public ActionResult Edit(int idObject)
{
//...
}
}
或者,如果您不想装饰所有控制器和动作,但想在任何地方应用它,您可以将它添加到 Global.asax 的 Application_Start 的过滤器集合中
GlobalFilters.Filters.Add(new HandleForbiddenRedirect());