実際には、403 リダイレクトに web.config を使用することはできません。
できることはOnActionExecuted
、コントローラーをオーバーライドしてステータス コードを確認し、web.config で定義されているものにリダイレクトすることです。
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());