ASP.. NET MVC AuthorizeAttribute如何支持检查角色



在我的控制器中,我有像[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中的源代码应该是一个很好的起点

相关内容

  • 没有找到相关文章

最新更新