2009-08-14 47 views
28

我創建一個自定義角色的供應者,我設置了授權屬性指定在我的控制器作用,它的工作就好了,像這樣:ASP.NET MVC重定向到一個拒絕訪問頁面使用自定義角色提供

[Authorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 
... 

但是,當用戶不能訪問此控制器時,他將被重定向到登錄頁面。 如何將他重定向到「AcessDenied.aspx」頁面?

回答

42
[AccessDeniedAuthorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if(filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectResult("~/AcessDenied.aspx"); 
     } 
    } 
} 
+6

如果用戶登錄並嘗試訪問該頁面,他們將被重定向到AccessDenied頁面。好。但是,如果用戶未登錄,他們將被重定向到AccessDenied頁面。壞。在這種情況下,他們應該被重定向到登錄頁面。 – 2011-01-19 18:06:05

+3

如果您希望頁面在用戶不在的情況下正常重定向,請在base.OnAuthorization()方法調用之後,在檢查Threading.Thread.CurrentPrincipal的其餘代碼周圍添加if語句。 Identity.IsAuthenticated。這樣,用戶被定向到AccessDenied頁面,除非用戶沒有被認證...在這種情況下,它將執行默認操作(重定向到登錄頁面) – Frinavale 2013-11-01 17:47:39

+0

這個類別在哪裏被放置?在控制器中? – Jay 2013-12-05 14:43:16

8

看看tvanfossonAnswerthis very similar question,這是我在做什麼(感謝tvanfosson),所以現在我不得不說:

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

如果用戶不在角色中,他們將獲得由ViewName指定的視圖。

22

這是我的解決方案,基於歐盟的答案。 如果用戶沒有登錄,Mine會將用戶正確重定向到登錄頁面,但如果他們已登錄但未經授權查看該頁面,則拒絕訪問拒絕頁面。

[AccessDeniedAuthorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new RedirectResult("~/Account/Logon"); 
      return; 
     } 

     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectResult("~/Account/Denied"); 
     } 
    } 
} 

AccountController.cs:

public ActionResult Denied() 
{ 
    return View(); 
} 

查看/帳戶/ Denied.cshtml:(剃刀語法)

@{ 
    ViewBag.Title = "Access Denied"; 
} 

<h2>@ViewBag.Title</h2> 

Sorry, but you don't have access to that page. 
+1

從接受的答案完美修改,謝謝兄弟 – 2014-06-12 04:43:57

6

的輕微改善馬特的答案b Ÿ避免需要硬編碼登錄頁面和可選設置屬性中的訪問被拒絕的觀點:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedViewName { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (string.IsNullOrWhiteSpace(AccessDeniedViewName)) 
       AccessDeniedViewName = "~/Account/AccessDenied"; 

      filterContext.Result = new RedirectResult(AccessDeniedViewName); 
     } 
    } 
} 
0
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 

      if (filterContext.Result is HttpUnauthorizedResult && WebSecurity.IsAuthenticated) 
      { 
       filterContext.Result = new RedirectResult("~/Account/AccessDenied"); 
      } 
     } 
    } 
0

我已經建立在維克的回答讓我有一個不同的拒絕訪問頁面每個應用程序的區域。

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedController { get; set; } 
    public string AccessDeniedAction { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction)) 
      { 
       AccessDeniedController = "Home"; 
       AccessDeniedAction = "AccessDenied"; 
      } 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction })); 
     } 
    } 
} 
0

只是一個小更新維克城堡, 添加細節:返回一個RedirectToRouteResult代替,這而不是重定向到URL相對於將其重定向到當前區域的控制和操作的應用程序的根乾的在重定向 請求網址,以便能夠登錄的拒絕訪問的細節和,如果誰想要

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedViewName { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (string.IsNullOrWhiteSpace(AccessDeniedViewName)) 
       AccessDeniedViewName = "~/Account/AccessDenied"; 

      var requestUrl = filterContext.HttpContext.Request.Url; 

      filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl)); 
     } 
    } 
} 
5

重定向並不總是最好的解決辦法

使用斯坦dard http代碼403:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
相關問題