如何显示Http 401结果的自定义错误页面?

时间:2009-09-14 15:32:35

标签: asp.net-mvc

我有一个具有Authorize属性的控制器,如下所示:

[Authorize(Roles = "Viewer")]
public class HomeController : Controller
{
   //...
}

我的web.config的customErrors设置如下:

<customErrors mode="On">
      <error statusCode="401" redirect="notauthorized.html"/>
  </customErrors>

当我尝试使用非授权角色在Home控制器上调用操作时,我只得到一个空白页面。我没有被重定向到自定义页面。 有什么想法吗?

4 个答案:

答案 0 :(得分:12)

我很欣赏这个问题有点旧,但这可能有助于某人。

对于401,您可能会看到标准的401 Unauthorized页面,即使您已将401添加到web.config中的customersrors部分。我读到在使用IIS和Windows身份验证时检查发生在ASP.NET甚至看到请求之前,因此您在Cassini上看到空白页面,在IIS上看到它自己的401。

对于我的项目,我编辑了Global.asax文件,以重定向到我为401错误创建的路由,将用户发送到“Unauthorized to see this”视图。

在Global.asax中:

    void Application_EndRequest(object sender, System.EventArgs e)
    {
        // If the user is not authorised to see this page or access this function, send them to the error page.
        if (Response.StatusCode == 401)
        {
            Response.ClearContent();
            Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults);
        }
    }

并在Route.config中:

        routes.MapRoute(
        "ErrorHandler",
        "Error/{action}/{errMsg}",
        new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional }
        );

并在控制器中:

    public ViewResult Unauthorised()
    {
        //Response.StatusCode = 401; // Do not set this or else you get a redirect loop
        return View();
    }

答案 1 :(得分:3)

tvanfosson查看Answerthis very similar question,这就是我正在做的事(感谢tvanfosson),所以现在我只想说:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")]
public class SuperAdminController : Controller
...

如果用户不在角色中,他们将获得ViewName指定的视图。

注意:空白页面来自Cassini,如果您将应用程序移动到实际的IIS服务器,您将看到401。

答案 2 :(得分:1)

据我所知,标准方法是使用一个简单的错误控制器来处理传入的请求,并根据返回的httpstatus代码输出相应的视图......如下所示:

  public class ErrorController : Controller
{

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult Index()
    {

        //Check if the statuscode is HttpStatusCode.NotFound;
         if(Response.StatusCode == 401)
             return View("NotAuthorised");
        return View();
    }
}

然后在webconfig中指定重定向操作:

<customErrors mode="On" defaultRedirect="~/Error" />

答案 3 :(得分:0)

您还可以创建自己的自定义授权属性,并设置自己的路线以重定向页面上的用户。

这是我项目的示例:

/*../controllers/CustomAuthorizationAttribute.cs  */
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter
{
    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
    {
        string session = filterContext.HttpContext.Session["id"] != null ? filterContext.HttpContext.Session["id"].ToString() : null;
        if ( string.IsNullOrEmpty(session) )
        {
            // Unauthorized!
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "action", "Create" }, { "controller", "Sessions" } 
                    //,{ "parameterName", "YourParameterValue" }
                }
            );
        }
    }
}

然后在动作控制器中添加“标志”,如下所示

/*../controllers/ReportsController.cs  */
public class ReportsController : Controller
{
    [CustomAuthorizationAttribute]
    public ActionResult Index()
    {
        //do something
    }
}