2013-11-28 168 views
1

我有一個新的ASP.NET MVC應用程序的需求。當用戶登錄到網站時,我們需要調用一個黑盒來查看用戶是否被允許使用控制器/操作。ASP.NET MVC授權 - 自定義?

我們所有的控制器在默認情況下都具有[Authorize]屬性(Login除外),但只有在黑盒表示用戶可以時才能調用某些操作。

我如何獲得MVC子系統(我猜通過類似於自定義[Authorize?]的東西)以響應未經授權的響應,當登錄用戶嘗試訪問黑盒子中的控制器操作時不能。

這裏是我們稱之爲黑盒的方式:

bool canAccess = BlackBox.HasAccess(controllerName, ActionName, userGuid); 

回答

2

我建議一個自定義Authorize屬性(因爲你已經猜到了)。

這裏是下面一個例子:

public class BlackBoxAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     bool authorized = base.AuthorizeCore(httpContext); 

     if (authorized) 
     { 
      var routeData = httpContext.Request.RequestContext.RouteData; 
      var controller = routeData.GetRequiredString("controller"); 
      var action = routeData.GetRequiredString("action"); 

      bool canAccess = BlackBox.HasAccess(controller, action, userGuid); 

      if (!canAccess) 
      { 
       httpContext.Items["BlackBoxError"] = true; 
       return false; 
      } 

      return true; 
     } 
     else 
     { 
      return authorized; 
     } 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     bool blackBoxError = filterContext.HttpContext.Items["BlackBoxError"] != null && Convert.ToBoolean(filterContext.HttpContext.Items["BlackBoxError"].ToString()); 

     if (blackBoxError) 
     { 
      //change the controler name and action name accordingally as needed. 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
                     { 
                      { "controller", "Error" }, 
                      { "action", "BlackBoxError" } 
                     } 
                    ); 
     } 

     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

有了這個地方你必須與BlackBoxAuthorizeAttribute替換所有AuthorizeAttribute註解。或者更好:從控制器中刪除AuthorizeAttribute,並在app_start中註冊一個全局屬性。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      filters.Add(new BlackBoxAuthorizeAttribute()); 
     } 

希望這會有所幫助!

問候, 烏羅什

+0

如果BlackBox不是靜態的呢?這是緊密的耦合,這似乎有點問題... – Bartosz

0

你可以嘗試從AuthorizeAttribute繼承和創建你自己的屬性。

public class BlackboxAuthorizeAttribute : AuthorizeAttribute 
{ 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
//write here custom authorization logic 
} 
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext) 
{ 

} 
} 

然後在您的控制器操作上使用您的自定義授權屬性。