代码之家  ›  专栏  ›  技术社区  ›  zsharp

Authorize属性,按角色和一个其他用户ID进行筛选

  •  1
  • zsharp  · 技术社区  · 15 年前

    我如何包括一个用户,而不考虑他的角色,依赖于匹配的用户ID,并且不总是同一个用户:

     [Authorize(Roles="Group1") AND userID=uniqueID]
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   tvanfosson    15 年前

    您将无法使用默认的authorized属性执行此操作。您需要使用添加用户行为的自定义类来扩展AuthorizeAttribute。通常,它使用命名用户,但您可以提供一种替代方法。通常情况下,如果同时提供用户和角色,则需要用户位于用户列表中并具有指定的角色之一。

    public class UserOrRoleAuthorizeAttribute : AuthorizeAttribute
    {
        public int? SuperUserID { get; set; }
    
        protected override bool AuthorizeCore( HttpContextBase httpContext )
        {
             if (base.AuthorizeCore( httpContext ))
             {
                 var userid == ...get id of current user from db...
                 return userid == this.SuperUserID;
             }
             return false;
        }
    }
    

    [UserOrRoleAuthorize(Roles="Admin",SuperUserID=15)]
    public ActionResult SomeAction() ...
    

    请注意,您还可以添加某种方式来指定在何处查找此操作的id,即。,

     Table="Admins",Column="AdminID",MatchProperty="Company",MatchParameter="company"
    

    然后将一些代码放入属性中,以查找属性表和列中的值,并将其与指定的RouteValue条目进行比较,而不是对其进行硬编码。

        2
  •  1
  •   Daniel Elliott    15 年前

    您可以编写自定义授权筛选器(实现) IAuthorizationFilter

    您的自定义授权筛选器可以将用户ID作为参数。

    差不多

    public class 
        YourAuthorizeFilterAttribute : AuthorizeAttribute,  IAuthorizationFilter
    {
        public string UserId { get; set; }
    
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if(filterContext.HttpContext.User.Identity.Name != UserId && 
                !filterContext.HttpContext.User.IsInRole(base.Roles))
            {
                filterContext.Result = new RedirectResult("/Account/LogOn");
            }
        }
    }
    

    然后像这样使用你自己的过滤器

    [YourAuthorizeFilter(UserId = "theuser", Roles ="Group1")]
    

    仁慈