我已经看到了很多关于这个问题的答案,但似乎没有一个适合我的。我在 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 有很多我不知道的事情,但这是我尝试过的:
- 将 IP 地址作为参数传递
- 传递您在代码中看到的域名
- 我也尝试过传递我实际上从控制器变量中获得的域控制器的 IP 地址。
似乎没有任何效果。正如我所提到的,我们有三个域 alfa。比方说,贝塔,伽玛。无论我尝试什么,我总是得到他试图连接到阿尔法的例外。有任何想法吗?很抱歉这个问题很长,但我尽量做到最具体。我还可以告诉您,当管理员将此 alfa 控制器添加到防火墙时,问题就会消失,但这并不好。我们依赖于这个控制器将永远存在的事实,但是当它死亡时该怎么办?我想让我的应用程序在那一刻说防弹:)
附言。我不想使用 DirectoryEntry 方法,因为它很痛苦,因为我必须知道所有查询内容等。如果这是唯一的方法,那么我将不胜感激一些简单的教程,也许会逐步解释这一点。