0

我已经看到了很多关于这个问题的答案,但似乎没有一个适合我的。我在 AD 身份验证方面非常苦恼。情况看起来像这样。

我们洞穴三个域控制器。我们想连接正确的,这样我们就不会得到这个异常。情况是这样的:在我的本地机器上,我没有遇到任何问题,但是当我每次通过 AD 进行身份验证时部署到服务器上的 IIS 时,我都会收到此错误。这是我正在使用的代码。这是在我进行了几次更正检查以及来自 google 和 stackoverflow 的信息之后:

public PrincipalContext GetPrincipalContext(string domainName, string userName, string password)
    {
        try
        {
            this.logger.Info("Connecting to LDAP");
            var domainContext = new DirectoryContext(DirectoryContextType.Domain,userName, password);

            var domain = Domain.GetDomain(domainContext);

            var controller = domain.FindDomainController();

            this.logger.Info("IP Address: {0}", controller.IPAddress);
            this.logger.Info("Domain: {0}", controller.Domain.Name);
            this.logger.Info("Controller name: {0}", controller.Name);
            this.logger.Info("Site name: {0}", controller.SiteName);
            this.logger.Info("Schema name: {0}", controller.Forest.Schema.Name);

            var context = new PrincipalContext(ContextType.Domain, "makler.local", "DC=makler,DC=local");

            this.logger.Info("context.ConnectedServer {0}", context.ConnectedServer);
            this.logger.Info("context.Container {0}", context.Container);
            this.logger.Info("context.ContextType {0}", context.ContextType);
            this.logger.Info(" context.Options {0}", context.Options);
            this.logger.Info("context.UserName {0}", context.UserName);

            return context;
        }
        catch (Exception ex)
        {
            this.logger.Info("Could not connecto to LDAP: {0}", ex.Message);
            throw new ApplicationException(string.Format("Could not connecto to LDAP: {0}", ex.Message));
        }
    }

这是我获取 UserPrincipal 的地方,以便我有一些关于组的用户信息和类似的东西:

public UserPrincipal GetUserPrincipal(PrincipalContext principalContext, string userName)
    {
        try
        {
            this.logger.Info("Getting user principal, connected server {0}", principalContext.ConnectedServer);
            return UserPrincipal.FindByIdentity(principalContext, userName);

        }
        catch (Exception ex)
        {
            this.logger.Info("GetUserPrincipal exception {0}", ex.Message);
            throw new ApplicationException(string.Format("GetUserPrincipal exception {0}", ex.Message));
        }
    }

当我查看日志路径时,似乎这个问题不是来自 PrincipalContext,而是来自 UserPrincipal。关于 AD 有很多我不知道的事情,但这是我尝试过的:

  1. 将 IP 地址作为参数传递
  2. 传递您在代码中看到的域名
  3. 我也尝试过传递我实际上从控制器变量中获得的域控制器的 IP 地址。

似乎没有任何效果。正如我所提到的,我们有三个域 alfa。比方说,贝塔,伽玛。无论我尝试什么,我总是得到他试图连接到阿尔法的例外。有任何想法吗?很抱歉这个问题很长,但我尽量做到最具体。我还可以告诉您,当管理员将此 alfa 控制器添加到防火墙时,问题就会消失,但这并不好。我们依赖于这个控制器将永远存在的事实,但是当它死亡时该怎么办?我想让我的应用程序在那一刻说防弹:)

附言。我不想使用 DirectoryEntry 方法,因为它很痛苦,因为我必须知道所有查询内容等。如果这是唯一的方法,那么我将不胜感激一些简单的教程,也许会逐步解释这一点。

4

0 回答 0