使用两个不同的域进行验证

本文关键字:验证 两个 | 更新日期: 2023-09-27 18:21:24

我目前正在为一个新项目执行验证步骤。除此部分(如下所述)外,所有代码都在工作。我正在尝试检查用户(domain1)是否在domain2的组中。我所尝试的一切都是为用户返回一个null,我不知道为什么。

这是我正在使用的函数。

public void runTask(string serverName, string taskName)
        {
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain);
            UserPrincipal user = UserPrincipal.FindByIdentity(ctx, loginWindow.getUsername());
            GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, ADGroup);

            if (user.IsMemberOf(group))
            {
                using (TaskService tasksrv = new TaskService(serverName, loginWindow.getUsername(), domain, loginWindow.getPassword()))
                {
                    Microsoft.Win32.TaskScheduler.Task task = tasksrv.FindTask(taskName);
                    if (!task.IsActive)
                    {
                        if (task.Enabled == true)
                        {
                            //task.Run();
                        }
                        else
                        {
                            log.LogMessage("Task was disabled. Enabling...");
                            task.Enabled = true;
                            //task.Run();
                        }
                    }
                    else
                    {
                        // send email
                        string body = "User: " + loginWindow.getUsername().ToUpper() + "<br/><br/>" + "Server: " + serverName + "<br/><br/>" + task.Name + " is already running.";
                        // send email confirmation
                        email = new Email(false);
                        email.SendMail(toEmail, fromEmail, serverName + subject, body);
                    }
                }
            }
        }

当我将domain=设置为用户名所在的位置时,它会返回一个值,但找不到ADGroup。当我将其切换到ADGroup的域时,该用户为null。

loginDow是一个简单的类,用于验证用户凭据。任务是我尝试运行的windows任务。

任何想法或建议都会很有帮助,因为现在我不知所措。

谢谢!

使用两个不同的域进行验证

好吧,从代码来看,您似乎使用了同一个域范围的PrincipalContext对象来查找用户和组,由于它们实际上位于不同的域中,因此至少每个查找都应该使用自己的上下文来执行:

        PrincipalContext userCtx = new PrincipalContext(ContextType.Domain, domain1);
        UserPrincipal user = UserPrincipal.FindByIdentity(userCtx, loginWindow.getUsername());
        PrincipalContext groupCtx = new PrincipalContext(ContextType.Domain, domain2);
        GroupPrincipal group = GroupPrincipal.FindByIdentity(groupCtx, ADGroup);

这将为用户提供非空结果。不过,我不确定user.IsMemberOf(group)是否有效。Active Directory使用foreignSecurityPrincipal记录来保存跨域组成员身份的记录,并且仅使用组的members属性。用户记录没有得到匹配的memberOf记录。有关详细信息,请参阅此处的答案。