我有一个需要角色和网站的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。
(我担心这可能最终会出现在主观问题的灰色区域,但我相信其中有一个知识核心,如果你有关于如何更好地说出来的建议,对许多人有用)
答案 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");
}
}
}