0

我正在寻找解决问题的最佳方法,我们想要做的是使用活动目录进行基本登录,这样我们就不必管理密码等。但我们想要创建自定义角色,而不是使用 AD 组。所以我可能有一个角色,相当于 5 个不同的 AD 组。

我想做的是通过 c# 将特定组中的所有用户转储到自定义用户表,该表链接到角色 ID 到用户 ID 表。有人对此有任何想法吗?但是我还需要以某种方式管理自定义用户表,如果有人从其中一个组中删除,那么他们需要释放访问权限,不知道如何处理那个。

目前我的方法看起来像这样:

        using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "SETON"))
        {
            //Gets all Users in a AD Group
            using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupName))
            {
                //Mkae sure group is not null
                if (grp != null)
                {
                    foreach (Principal p in grp.GetMembers())
                    {
                        //Sets up Variables to enter into Finance User Table
                        string UserName = p.SamAccountName;
                        string DisplayName = p.Name;
                        string emailAddress = p.UserPrincipalName;

                        //Get users detials by user
                        using (UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, UserName))
                        {
                            if (userPrincipal != null)
                            {                                    
                                //Test to see if user is in AD Group
                                bool inRole = userPrincipal.IsMemberOf(grp);
                                if (inRole)
                                {
                                    //Test to See if UserName already exists in Finance User Table
                                    var ds = User.GetUserList(UserName);

                                    //If don't exist add them and to the new Role
                                    if (ds.Tables[0].Rows.Count == 0)
                                    {
                                        //Add User to FinanceUSer Table
                                        Seton.Roster.User user = new User();
                                        user.UserName = UserName;
                                        user.Name = DisplayName;                                            
                                        int id = user.Save();

                                        //Get RoleID by RoleName with Method
                                        var roleDS = SecurityRole.GetRoleList(roleName);
                                        if (roleDS.Tables[0].Rows.Count > 0)
                                        {
                                            var roleDR = roleDS.Tables[0].Rows[0];
                                            int roleid = Convert.ToInt32(roleDR["roleid"].ToString());
                                            SecurityRoleUserLink.AddNewLink(roleid, id);
                                        }
                                    }
                                    //if they exist just Get thier userid and add them to new Role
                                    else
                                    {
                                        //Get UserID of existing FinanceUser
                                        var userDR = ds.Tables[0].Rows[0];
                                        int id = Convert.ToInt32(userDR["userid"].ToString());

                                        //Get RoleID by RoleName with Method
                                        var roleDS = SecurityRole.GetRoleList(roleName);
                                        if (roleDS.Tables[0].Rows.Count > 0)
                                        {
                                            var roleDR = roleDS.Tables[0].Rows[0];
                                            int roleid = Convert.ToInt32(roleDR["roleid"].ToString());

                                            //Test to see if user already in this role
                                            if(!SecurityRoleUserLink.UserInRole(id,roleid))
                                                SecurityRoleUserLink.AddNewLink(roleid, id);  
4

2 回答 2

0

我已经通过几种方式做到了这一点,但答案实际上是关于您希望实现安全性的复杂程度。你是在做现场级别还是记录级别?

  1. 在您的应用程序中缓存 AD 用户帐户和组以便快速检索。
    • 优点 - 帐户在您的数据库中,如果 AD 有问题,您不是 SOL。
    • 缺点 - 需要重新填充并按计划进行,并且可能不同步
  2. 将 AD 用于用户和组,并将应用程序组映射到域组。
    • 优点 - 让 AD 完成您的工作,因此您不必在应用程序中管理它

当然还有更多的优点和缺点,但是,对我来说,这些很突出。

我们目前使用 AzMan,但它不受支持 - 据我所知。它在大多数情况下运行良好,但是您必须考虑很多来回同步以及性能,您最终仍将其缓存在应用程序中。

您还可以在 code plex 上找到一个开源:NetSqlAzMan,它看起来很有前途。

于 2012-07-13T13:36:15.320 回答
0

我认为你正在重新发明轮子。查看MS Windows 授权管理器(AzMan) 之类的产品,或者它的开源等效产品

这些允许您定义“操作”(即用户可以执行的任务),并将这些操作映射到 AD 组。除此之外,它们还可以让您做更多的事情,但至少它们肯定会满足您的需求。

AzMan 配置可以存储在 XML、数据库或 AD 中,因此在这方面也非常灵活。

于 2012-07-13T13:26:09.643 回答