2009-09-14 151 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 
    } 
}