2009-09-23 29 views

回答

4

您將無法使用默認做到這一點AuthorizeAttribute。您將需要使用添加用戶行爲的自定義類來擴展AuthorizeAttribute。通常它使用命名用戶,但您可以提供替代方案。通常,如果您同時提供用戶和角色,則需要用戶進入用戶列表並具有指定角色之一。

public class UserOrRoleAuthorizeAttribute : AuthorizeAttribute 
{ 
    public int? SuperUserID { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      var userid == ...get id of current user from db... 
      return userid == this.SuperUserID; 
     } 
     return false; 
    } 
} 

用作:

[UserOrRoleAuthorize(Roles="Admin",SuperUserID=15)] 
public ActionResult SomeAction() ... 

需要注意的是,你還可以添加在specifing到哪裏查找ID爲這次行動,.IE的一些方法,

Table="Admins",Column="AdminID",MatchProperty="Company",MatchParameter="company" 

然後放將一些代碼放入屬性中以查找屬性表和列中的值,並將其與指定的RouteValue條目進行比較,而不是對其進行硬編碼。

+0

superUserID將取決於發佈參數的值。 – zsharp 2009-09-23 23:06:07

+0

然後添加類似於我在替代項中列出的屬性,以指定路徑值中的哪些參數用於查找正確的用戶。這些將是RouteValueDictionary中的鍵。設計自定義屬性中的邏輯,從適當的表中提取id並將其與當前用戶進行比較。 – tvanfosson 2009-09-24 00:41:34

+0

究竟是RouteValueDicitonary? – zsharp 2009-09-24 18:51:33

1

你可以寫一個自定義的授權過濾器(執行IAuthorizationFilter

您的自定義授權過濾器可能會將userId作爲參數。

喜歡的東西

public class 
    YourAuthorizeFilterAttribute : AuthorizeAttribute, IAuthorizationFilter 
{ 
    public string UserId { get; set; } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.Name != UserId && 
      !filterContext.HttpContext.User.IsInRole(base.Roles)) 
     { 
      filterContext.Result = new RedirectResult("/Account/LogOn"); 
     } 
    } 
} 

然後使用自己的過濾器,像這樣

[YourAuthorizeFilter(UserId = "theuser", Roles ="Group1")] 

善良,

+0

您可能會冒風險讓用戶失敗。我更喜歡沒有風險的解決方案。 – tvanfosson 2009-09-23 21:38:13

+0

同意修改了一下 – 2009-09-23 21:42:07