制作asp.net SimpleMembershipProvider角色的策略具有层次关系

时间:2013-08-12 12:19:32

标签: c# asp.net simplemembership roleprovider

我意识到这对Question来说可能很简单,但答案并不是我想要的。

可能是我想要的更接近的问题是this SO question

我正在使用的情况是使用SimpleMemberShip Provider和ASP.NET MVC4应用程序。我根据他们在Active Directory中的位置定义角色。因此,登录和用户访问权限基于他们居住在AD内部的OU / Group。我们在登录时做了类似的事情:

在自定义登录界面的构造函数

static UserAuthenticationManager()
    {
        //Create some roles for SimpleMembership 
        if (!Roles.RoleExists("IT"))
            Roles.CreateRole("IT");
        if (!Roles.RoleExists("Student"))
            Roles.CreateRole("Student");
        if (!Roles.RoleExists("Faculty"))
            Roles.CreateRole("Faculty");
        if (!Roles.RoleExists("Adjunct"))
            Roles.CreateRole("Adjunct");
    }

随着Intranet应用程序向不同部门开放,这将随着时间的推移而大幅增长。

这是我分配角色的方式

if (StaffAd.UserIsInGroup(username, "IT"))
            Roles.AddUserToRole(username, "IT");
        if (StaffAd.UserIsInGroup(username, "Faculty"))
            Roles.AddUserToRole(username, "Faculty");
        if (StaffAd.UserIsInGroup(username, "Adjunct Faculty Current"))
            Roles.AddUserToRole(username, "Adjunct");
        if (StaffAd.UserIsInGroup(username, "Active_Student"))
            Roles.AddUserToRole(username, "Student");

在此''UserIsInGroup()'方法中,使用用户名和AD的名称来验证用户是否属于该组。

我担心的问题是

  1. Roles的构造函数将获得loooooong。
  2. 分配的角色也会变长。用户可能属于多个组。
  3. 授权属性也将大幅增长。
  4. 例如关注数字3:

    [Authorize(Roles = "IT, DegreeTracker, Student")]
    

    我希望能够确保不会遇到一些障碍,例如角色更改(可能只是添加代码以查看某人的角色并在每次登录时更新为最新版本),如以及管理很多角色。很多角色可以组合在一起,比如'DegreeTracker'和'Student'都是AD组,所以我可以定义一个名为'DegreeUsers'的角色,它是两个子角色的父角色。

    这看起来像是一种管理情况并保持代码清洁的智能方式吗?如果是这样,是否会覆盖Authorize属性?

1 个答案:

答案 0 :(得分:1)

看看这个article on decoupling your security design from application design。我认为它可能在这种情况下很好用。本文介绍如何扩展SimpleMembership数据库并创建自定义授权属性,该属性接受资源和操作作为参数而不是角色。在这种情况下,您的资源将是Active Directory中的组织单位。然后,您可以修改角色到数据库中资源/操作的映射,而不是遍历所有代码并更改授权属性,重新编译和重新部署。