1

ロールとサイトが必要な ASP.NET アプリケーションがあります。

簡単な例:

サイト A: 管理者、編集者、読み取り専用

サイト B: 管理者、編集者、読み取り専用

サイト C: 管理者、編集者、読み取り専用

組み込みの ASP.NET ロール アクション フィルターは、必要なロールの 1 つのディメンションを処理できますが、ロールがどのサイトからのものかは考慮されません。

[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.
}

2 番目のディメンション/軸 (サイト) の役割を構成/拡張する方法はありますか? 各サイトには、元のサイトと同じ役割が必要です。

サイト 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 に答える