授权属性,按角色过滤,只有一个其他用户ID

时间:2009-09-23 21:20:24

标签: asp.net-mvc

我如何根据匹配的用户ID而不管其角色包括用户,而不是总是使用相同的用户:

 [Authorize(Roles="Group1") AND userID=uniqueID]

2 个答案:

答案 0 :(得分:4)

您将无法使用默认的AuthorizeAttribute执行此操作。您需要使用添加用户行为的自定义类扩展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的位置,.i.e。,

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

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

答案 1 :(得分:1)

您可以编写自定义授权过滤器(实现IAuthorizationFilter

您的自定义授权过滤器可以将userId作为参数。

这样的东西
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")]

善,