如何在ASP.Net MVC中为角色添加第二维/轴?

时间:2013-03-27 18:03:36

标签: asp.net asp.net-mvc asp.net-mvc-4

我有一个需要角色和网站的ASP.NET应用程序。

简化示例:

网站A:管理员,编辑,ReadOnly

网站B:管理员,编辑,ReadOnly

网站C:管理员,编辑,ReadOnly

内置的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。

(我担心这可能最终会出现在主观问题的灰色区域,但我相信其中有一个知识核心,如果你有关于如何更好地说出来的建议,对许多人有用)

1 个答案:

答案 0 :(得分: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");
        }
    }        
}