通过 SSL 中的 LDAP 与 PrincipalContext-class 的慢速 AD-LDS 连接
Slow AD-LDS connection with the PrincipalContext-class via LDAP in SSL
在我的开发机器上,我必须安装一个 AD-LDS。原则上它工作正常,但是第一次通过 PrincipalContext-class 连接到 AD-LDS 非常慢(30 秒以上)。在我看来,它首先尝试连接到某个不存在的主机或目录,然后在超时(30 秒)后连接到我的 AD-LDS 并执行它应该执行的操作。
我在使用 LDP.exe 和 SSL 连接时观察到相同的行为。然而,使用 ADSI-Edit,通过 SSL 连接是超快的。通过非 SSL 连接也是如此。
我看看我是否能在 fiddler 中看到一些东西,但什么也没有。同样在事件日志中我什么也找不到。也许它与证书查找有关?它是用 makecert 自签名的。
更新
与此同时,我观察到一件可能给出提示的小事:在系统事件日志中,第一次建立到 AD-LDS 的 SSL 连接时,会出现以下消息:
名称 _ldap._tcp.[machineName
] 的名称解析在 none 个配置的 DNS 服务器响应后超时
不过,消息只注册一次,但每次连接到服务器都需要30秒以上。我也尝试在主机文件中输入相应的条目,但没有任何改变。
附加信息
可能这不是证书的问题,但也许它有助于解决问题。因此,这里是我创建证书的方式(或多或少的货物代码):
RootAuthority
makecert -pe -n "CN=MyDevRootAuthority" -ss my -sr LocalMachine -a sha1 -sky signature -r "MyDevRootAuthority.cer"
服务器证书
makecert -pe -n "CN=[MyComputerName]" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "MyDevRootAuthority" -is MY -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "MyTestCertificate.cer"
创建后,我将根权限移至受信任的权限并授予了所需的权限。
更新
最近遇到问题后,我深入挖掘发现,在构建PrincipalContext
时使用ContextOption
ServerBind
可靠地解决了问题,除了ValidateCredentials
-上下文中的方法。
SDS.P
的替代方法
附加信息:使用 SDS 和 SDS.AM 对我来说总是很复杂。由于其组件给出的通常不相关且不准确的错误信息(由于所用系统组件 (ADSI) 的复杂内部层次结构),它会花费大量时间。
最终,我将一些代码移到了 SDS.P 命名空间,尽管互联网上几乎没有关于如何使用的信息,但它似乎更合适、更漂亮。我不能代表每个人或每个领域,但是从基于 ADSI 的组件转移到 SDS.P(基于 wldap32.dll)对我来说已经简化和澄清了很多。而且它的大部分部分甚至是异步工作的。作为奖励,它超级快。
一个很好的起点是:
https://msdn.microsoft.com/en-us/library/bb332056.aspx
旧解
问题来自于我的开发计算机不属于域的情况。我在域集成机器上尝试了同样的事情后看到了这个,但问题没有发生。
解决方案(针对未嵌入AD的计算机)
代码
在代码中,要连接 DirectoryContext
,必须使用 dns 后缀“.local”指定主机名。
[machinename].local
网络适配器
此外,在“高级”-window 的网络适配器设置中,在“DNS”选项卡下,必须将“本地”后缀注册为连接 DNS 地址的 DNS 后缀。
证书
但是,证书我没有更改。
在我的开发机器上,我必须安装一个 AD-LDS。原则上它工作正常,但是第一次通过 PrincipalContext-class 连接到 AD-LDS 非常慢(30 秒以上)。在我看来,它首先尝试连接到某个不存在的主机或目录,然后在超时(30 秒)后连接到我的 AD-LDS 并执行它应该执行的操作。
我在使用 LDP.exe 和 SSL 连接时观察到相同的行为。然而,使用 ADSI-Edit,通过 SSL 连接是超快的。通过非 SSL 连接也是如此。
我看看我是否能在 fiddler 中看到一些东西,但什么也没有。同样在事件日志中我什么也找不到。也许它与证书查找有关?它是用 makecert 自签名的。
更新
与此同时,我观察到一件可能给出提示的小事:在系统事件日志中,第一次建立到 AD-LDS 的 SSL 连接时,会出现以下消息:
名称 _ldap._tcp.[machineName
] 的名称解析在 none 个配置的 DNS 服务器响应后超时
不过,消息只注册一次,但每次连接到服务器都需要30秒以上。我也尝试在主机文件中输入相应的条目,但没有任何改变。
附加信息
可能这不是证书的问题,但也许它有助于解决问题。因此,这里是我创建证书的方式(或多或少的货物代码):
RootAuthority
makecert -pe -n "CN=MyDevRootAuthority" -ss my -sr LocalMachine -a sha1 -sky signature -r "MyDevRootAuthority.cer"
服务器证书
makecert -pe -n "CN=[MyComputerName]" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "MyDevRootAuthority" -is MY -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "MyTestCertificate.cer"
创建后,我将根权限移至受信任的权限并授予了所需的权限。
更新
最近遇到问题后,我深入挖掘发现,在构建PrincipalContext
时使用ContextOption
ServerBind
可靠地解决了问题,除了ValidateCredentials
-上下文中的方法。
SDS.P
的替代方法
附加信息:使用 SDS 和 SDS.AM 对我来说总是很复杂。由于其组件给出的通常不相关且不准确的错误信息(由于所用系统组件 (ADSI) 的复杂内部层次结构),它会花费大量时间。
最终,我将一些代码移到了 SDS.P 命名空间,尽管互联网上几乎没有关于如何使用的信息,但它似乎更合适、更漂亮。我不能代表每个人或每个领域,但是从基于 ADSI 的组件转移到 SDS.P(基于 wldap32.dll)对我来说已经简化和澄清了很多。而且它的大部分部分甚至是异步工作的。作为奖励,它超级快。
一个很好的起点是:
https://msdn.microsoft.com/en-us/library/bb332056.aspx
旧解 问题来自于我的开发计算机不属于域的情况。我在域集成机器上尝试了同样的事情后看到了这个,但问题没有发生。
解决方案(针对未嵌入AD的计算机)
代码
在代码中,要连接 DirectoryContext
,必须使用 dns 后缀“.local”指定主机名。
[machinename].local
网络适配器
此外,在“高级”-window 的网络适配器设置中,在“DNS”选项卡下,必须将“本地”后缀注册为连接 DNS 地址的 DNS 后缀。
证书
但是,证书我没有更改。