2013-03-27 74 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