我如何可以包括用戶無論他的角色,取決於匹配用戶ID,而且並不總是相同的用戶:授權屬性,由角色過濾器,只是一個其他用戶ID
[Authorize(Roles="Group1") AND userID=uniqueID]
我如何可以包括用戶無論他的角色,取決於匹配用戶ID,而且並不總是相同的用戶:授權屬性,由角色過濾器,只是一個其他用戶ID
[Authorize(Roles="Group1") AND userID=uniqueID]
您將無法使用默認做到這一點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() ...
需要注意的是,你還可以添加在specifing到哪裏查找ID爲這次行動,.IE的一些方法,
Table="Admins",Column="AdminID",MatchProperty="Company",MatchParameter="company"
然後放將一些代碼放入屬性中以查找屬性表和列中的值,並將其與指定的RouteValue條目進行比較,而不是對其進行硬編碼。
你可以寫一個自定義的授權過濾器(執行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")]
善良,
丹
您可能會冒風險讓用戶失敗。我更喜歡沒有風險的解決方案。 – tvanfosson 2009-09-23 21:38:13
同意修改了一下 – 2009-09-23 21:42:07
superUserID將取決於發佈參數的值。 – zsharp 2009-09-23 23:06:07
然後添加類似於我在替代項中列出的屬性,以指定路徑值中的哪些參數用於查找正確的用戶。這些將是RouteValueDictionary中的鍵。設計自定義屬性中的邏輯,從適當的表中提取id並將其與當前用戶進行比較。 – tvanfosson 2009-09-24 00:41:34
究竟是RouteValueDicitonary? – zsharp 2009-09-24 18:51:33