【问题标题】:How do I display a custom error page for an Http 401 result?如何显示 Http 401 结果的自定义错误页面?
【发布时间】:2010-11-28 04:22:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案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" />
    

    【讨论】:

      【解决方案2】:

      看看tvanfossonAnswer from this very similar question,这就是我正在做的事情(感谢tvanfosson),所以现在我只需要说:

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

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

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

      【讨论】:

      • 你的意思是如果我将应用程序移动到 IIS 我应该看到自定义页面?或者我应该只看到标准的 IIS 401 页面?
      【解决方案3】:

      我很欣赏这个问题有点老了,但这可能会对某人有所帮助。

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

      对于我的项目,我编辑了 Global.asax 文件以重定向到我为 401 错误创建的路由,将用户发送到“未经授权查看此内容”视图。

      在 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();
          }
      

      【讨论】:

        【解决方案4】:

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

        这是我项目的示例:

        /*../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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多