在我的控制器中,我有像[Authorize(Roles = "Administrators")]
这样的代码在上面注释了一些动作,我想知道AuthorizeAttribute
如何使用Roles参数(检查机制的实现)。我的目标是创建这个类的扩展,例如称为PrivilegeAttribute
,这样我就可以注释像[Privilege(Privileges = "read")]
这样的操作。在这个类中,我将检查用户的Role是否至少具有这个自定义过滤器中的一个特权(在本例中为read
)。我已经在代码和数据库中创建了角色和特权之间的关联,我需要帮助的是检查角色是否与特权相关联。
我试着看看信息是否有在HttpContextBase.User.Identity
,但我找不到它。谢谢你。
如果您不需要自己的自定义属性,并且可以使用其他属性,那么我建议使用这里描述的Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc包
作者:Dominick Baier
和
Git Hub示例代码
所以它基本上是这样工作的:在动作上添加一个属性,如下所示:
[ResourceAuthorize("View", "Customer")]
第一个参数是要检查的Action的名称,第二个参数是属性的名称。
然后你在你的代码中从ResourceAuthorizationManager派生并覆盖CheckAccessAssync方法
public class MyAuthorization : ResourceAuthorizationManager
{
public override Task<bool> CheckAccessAsync(ResourceAuthorizationContext context)
{
var resource = context.Resource.First().Value;
var action = context.Action.First().Value;
// getting the roles that are connected to that resource and action
// from the db. Context could of course be injected into the
// constructor of the class. In my code I assume that the table
// thank links roles, resources and actions is called Roles ToActions
using(var db = MyContext())
var roles = db.RolesToActions // Use your table name here
.Where(r => r.Resource == resource && r.Action == action).ToList();
foreach(var role in roles)
{
if(context.Principal.IsInRole(role.Name)
{
return Ok();
}
}
return Nok();
}
}
}
所以我希望这有帮助。但是,如果您希望实现自己的属性,那么ResourceAuthorization GitHub Repository中的源代码应该是一个很好的起点