我如何根据匹配的用户ID而不管其角色包括用户,而不是总是使用相同的用户:
[Authorize(Roles="Group1") AND userID=uniqueID]
答案 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")]
善,
丹