2012-03-20 68 views
6

我想知道是否可以禁用/覆蓋全部授權屬性。在ASP.NET MVC中覆蓋/禁用授權3

在開發機器上,Active Directory組織與生產環境完全不同。當我開發/測試開發環境時,我必須「移除」所有授權屬性。

不同類型的活動目錄組(在授權屬性中)用於控制器操作方法。

[Authorize] 
... 

[Authorize(Roles="domain\HR")] 
... 

[Authorize(Roles="domain\IT")] 
... 

在此先感謝..

回答

10

我會做到以下幾點:

  1. 編寫自定義的授權屬性,這將作爲默認版本的調試工作,並始終允許的動作,即

    public class MyAuthorizeAttribute: AuthorizeAttribute 
    { 
        protected override bool AuthorizeCore(HttpContextBase httpContext) 
        { 
         #if DEBUG 
         return true; 
         #else 
         return base.AuthorizeCore(httpContext); 
         #endif 
        } 
    } 
    
  2. 全部替換Authorize屬性在用自己的代碼,即

    [MyAuthorize] 
    ... 
    
    [MyAuthorize(Roles="domain\HR")] 
    ... 
    
    [MyAuthorize(Roles="domain\IT")] 
    ... 
    
  3. 在調試模式下不斷開發和發佈模式

發表如果你不希望被束縛到調試/發佈件事你可以在項目配置中指定您自己的條件編譯符號 - 例如DEVTEST,並在步驟1代碼中用DEVTEST代替DEBUG

+0

謝謝!這正是我正在尋找... – 2012-03-20 08:43:03

+0

嗨,我不能編輯它,因爲它只有1個字符,但基類拼寫錯誤(AuthrorizeAttribute,在'h'後面有一個'r'),代碼沒有像現在這樣正常工作。 Regards – Jaime 2014-05-07 07:29:35

+1

@Jaime:感謝您的發現!糾正。 – 2014-05-12 05:58:50

0

而是重寫AuthorizeAttribute的你認爲實現你自己的? 您可以創建屬性並處理驗證邏輯。

事情與此類似:

public class AuthorizeRolesAttribute : ActionFilterAttribute 
{ 
    public UserProfileRole[] Roles { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    var profile = ((ETMembershipUser)Membership.GetUser()).Profile; 
    if (profile != null) 
    { 
     foreach (UserProfileRole role in Roles) 
     { 
     if (role == profile.Role) 
      return; 
     } 
    } 
    //throw new SecurityException("You can not access this page"); 
    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
    redirectTargetDictionary.Add("action", "Index"); 
    redirectTargetDictionary.Add("controller", "Home"); 
    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 
    } 
} 
+2

-1對於非常不好的想法 - 通過不從現有的AuthorizationAttribute衍生來實現自定義授權屬性 – archil 2012-03-20 08:25:15

+0

爲什麼這是一個非常糟糕的主意? – MikeSW 2012-03-20 08:26:07

+1

@MikeSW,因爲當你不從AuthorizeAttribute派生時,你不會實現'IAuthorizationFilter'接口。而當你不這樣做時,你的過濾器的執行順序是不同的。例如,模型聯編程序將在您的'僞授權過濾器'之前運行**(我稱之爲僞,因爲您沒有實現適當的接口,因此它不是真正的授權過濾器)。我不會盡力去解決你的問題,但我完全同意他這是一個非常糟糕的設計。 – 2012-03-20 08:35:03