代码之家  ›  专栏  ›  技术社区  ›  Marco M.

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

  •  10
  • Marco M.  · 技术社区  · 17 年前

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

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

    还有我的网络。config的customErrors设置如下:

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

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

    4 回复  |  直到 17 年前
        1
  •  14
  •   VictorySaber    12 年前

    我知道这个问题有点老了,但这可能会帮助一些人。

    对于401,您可能会看到标准的401未经授权页面,即使您已将401添加到网站的customerrors部分。配置。我读到当使用IIS和Windows身份验证时,检查发生在ASP之前。NET甚至看到了这个请求,因此你可以在卡西尼号和IIS上看到它自己的401上的空白页。

    为了我的项目,我编辑了《环球时报》。asax文件重定向到我为401错误创建的路由,将用户发送到“未授权查看此”视图。

    在全球范围内。尽快:

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

    在路上。配置:

            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();
        }
    
        2
  •  3
  •   Community Mohan Dere    9 年前

    看看 tvanfosson 是的 Answer 从…起 this very similar question ,这就是我正在做的(多亏了tvanfosson),所以现在我只能说:

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

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

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

        3
  •  1
  •   Robban    17 年前

    据我所知,一种标准的方法是使用一个简单的错误控制器来处理传入的请求,并根据返回的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();
        }
    }
    

    然后在网络配置中指定重定向操作:

    <customErrors mode="On" defaultRedirect="~/Error" />
    
        4
  •  0
  •   alexandre-rousseau Jelle de Fries    10 年前

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

    以下是我的项目示例:

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