对用户的基于角色的访问控制

Posted

技术标签:

【中文标题】对用户的基于角色的访问控制【英文标题】:Role-Based Access Control to a User 【发布时间】:2015-07-22 20:15:17 【问题描述】:

我有一个使用实体框架的应用程序 MVC 4.0。

我有一个 USER 表、Role 表、Type 表。

角色可以是两者之一:AdministratorUser

类型可以是 8 个:无,Admin, Asst.Admin, ......

所以我想允许根据以下类型访问不同的页面:

1) 类型定义:

None    Con     Acc     Rec     St      Fr      Admin  AsAd  ( <-- Types)
----------------------------------------------------------

1.a) 更新客户端:

None    None    None    None    Edit    View    Full  Full  ( <-- Roles)

1.b) 新客户:

None    None    None    View    View    Edit    Full  Full  ( <-- Roles)

那么这将如何实现呢?

【问题讨论】:

到目前为止你有什么尝试?你尝试过什么吗?你用谷歌搜索过吗? 【参考方案1】:

您可以通过 AuthorizeAttribute 实现此目的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class ActionPermissionAttribute : AuthorizeAttribute

    public override void OnAuthorization(AuthorizationContext filterContext)
    
        var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
        var actionName = filterContext.ActionDescriptor.ActionName;

将此属性添加到您需要授权的所有操作中 - 在控制器上添加会使这更容易,甚至可以创建一个继承 Controller 的基本控制器,然后从中继承您的所有控制器。

然后您可以将您的控制器+动作与角色存储在数据库中

        // get allowed groups for this controller+action from the database (cache this)
        // get which AD groups the current user is in (or get from the DB etc)
        var userGroups = HttpContext.Current.Request.LogonUserIdentity.Groups
                         .Translate(typeof(System.Security.Principal.NTAccount))
        // check if user in in required group 

如果您真的想在每个操作的代码中定义权限,那么只需根据需要将属性添加到属性和属性构造函数。

我没有完全理解你的角色与类型,但在 MVC 中,一切都是一个动作(方法),所以你锁定了单个动作(没有“编辑”,只有一个叫做“编辑”的动作)。

【讨论】:

以上是关于对用户的基于角色的访问控制的主要内容,如果未能解决你的问题,请参考以下文章

基于角色的权限访问控制初步

云原生 kubernetes - 基于角色的访问控制RBAC

.Net Core实战之基于角色的访问控制的设计

如何在 Firebase 中实现基于角色的访问控制

基于角色的访问控制

基于角色的访问控制 (RBAC)权限管理