2009-09-14 153 views
10

我有一个授权控制器属性是这样的:如何显示Http 401结果的自定义错误页面?

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

和我的web.config设立类似的customErrors如下:

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

当我尝试调用主控制器上的动作使用非授权角色我只是得到一个空白页面。我没有被重定向到自定义页面。 任何想法?

回答

0

,据我所知的标准方法是有一个简单的错误控制器处理传入的请求和输出,这取决于则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

看看tvanfossonAnswerthis very similar question,这是我在做什么(感谢tvanfosson),所以现在我不得不说:

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

如果用户不在角色,他们将获得由VIEWNAME指定thew视图。

注:空白页从卡西尼来了,如果移动应用到实际的IIS服务器,你会看到401

+0

你的意思是,如果我的应用程序迁移到IIS我应该看到自定义页面?或者我应该只看到标准的IIS 401页面? – 2009-09-14 17:29:06

+0

你会看到401。 – 2009-09-14 17:30:41

9

我明白这个问题是有点老了,但是这可能帮助别人。

对于401,您可能会看到标准401未授权页面,即使您已将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(); 
    } 
0

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

这里对我的项目的样本:

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