1

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

简化示例:

站点 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 进行编辑,除非获得该权限。

(我担心这可能最终会陷入主观问题边缘的灰色地带,但我相信如果你对如何更好地用词提出建议,其中有一个对许多人有用的知识核心)

4

1 回答 1

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");
        }
    }        
}
于 2013-03-27T18:17:41.627 回答