2013-03-27 70 views
1

我有一個ASP.NET應用程序需要角色和站點。如何向ASP.Net MVC中的角色添加第二維/軸?

簡化的例子:

站點A:管理,編輯器,只讀

站點B:管理,編輯器,只讀

站點C:特權,編輯器,只讀

的內置在ASP.NET角色中,動作過濾器可以處理我們需要的角色的一個維度,但它並沒有考慮角色來自哪個站點。

[Authorize(Roles = "Admin, Editor")] 
public ActionResult EditSiteStatus(int SiteId) 
{ 
    // do work for this site 
    // should only be done by Admins or Editors authorized for this site only. 
} 

有沒有辦法配置/擴展第二維/軸(站點)的角色?每個網站都需要與原始網站相同的角色。

除非獲得該許可,否則站點B的「編輯器」不能編輯站點C.

(我擔心這可能在主觀題明朗的灰色地帶結束了,但我相信在它裏面的知識內核,如果你有建議,是非常有用的許多如何字更好)

+0

你如何存儲用戶的網站關聯? – mattytommo 2013-03-27 18:06:44

+0

我在設計階段,所以我打開如何存儲它們。我在問這個問題,以確定我是否能夠使用內置的ASP.NET角色。我可能需要構建自定義的用戶+角色+站點映射表和一些自定義操作過濾器,而不是內置角色。 – 2013-03-27 18:10:27

回答

0

你最好寫你自己的AuthorizeAttribute要做到這一點,是這樣的:

用法:

[AuthorizeSiteLevel(SiteLevel = "A", Roles = "Admin, Editor")] 
public ActionResult EditSiteStatus(int SiteId) 
{ 
    // do work for this site 
    // should only be done by Admins or Editors authorized for this site only. 
} 

實現:

public class AuthorizeSiteLevelAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    protected List<string> Roles { get; private set; } 
    protected string SiteLevel { get; private set; } 
    protected AuthorizeUserAttribute(string siteLevel, params string[] roles) 
    { 
     SiteLevel = siteLevel; 
     Roles = roles.ToList(); 
    } 

    protected virtual bool Authorize() 
    { 
     //Authorize logic here, checking User.IsInRole for each of the Roles 

     return authorized; 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Controller = (BaseController)filterContext.Controller; 

     if (!Authorize()) 
     { 
      filterContext.Result = RedirectToAction("Index", "Home"); 
     } 
    }   
} 
+0

好的解決方案。我認爲你對自定義屬性是正確的。這個實現唯一的缺點是我的目的,因爲它需要「SiteLevel」被硬編碼,這意味着我需要每個站點的副本。如果「SiteId」爲「A」(或者實際上是1,因爲它是一個整數),過濾器要求「管理員,編輯者」角色與同一站點#1匹配,那將會很好。我認爲這是可以做到的。基本上,Authorize()需要確保爲指定的SiteId匹配的角色。 – 2013-03-27 21:21:19

+0

@DanSorensen啊,這是缺點是啊。否則,你必須自己檢查每一個需要它的動作。你可以將它們存儲在Enum或其他東西中?那麼做'Sites.SiteA'還是什麼? – mattytommo 2013-03-27 21:27:23