3

我在 Server1 和 Server2 上的 ASP.NET 4 (4.0.30319) 应用程序池中部署的 webform 的代码中使用以下 C# 代码。

PrincipalContext pc = new PrincipalContext(ContextType.Domain, "testnet.testad.org:636", "dc=testnet,dc=testad,dc=org");
bool validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate);

Server1 正在运行:windows server 2003 SP2
IIS 6.0
ASP.NET 版本 4.0.30319

根据选项,验证需要 30-60 秒。
(注意:使用常规 ldap 它立即进行身份验证,没有延迟)

服务器 2 正在运行:windows server 2008 SP2
IIS 7.0
ASP.NET 版本 4.0.30319

运行与 Server1 完全相同的代码,Server2 几乎可以立即进行身份验证。
(我还尝试了针对另一台 IIS 7.0 服务器的代码,结果相同)

有没有人遇到过这个问题?
是否有在 IIS 6.0 服务器与 IIS 7.0 服务器上进行身份验证的替代方法?
有什么我需要配置、添加、删除等的吗?

感谢您对此的任何帮助。

..................................................... ..................................................... ………………………………………………………………………………………………………………………………………………

[更新]

我在发出 ldaps 身份验证请求时打开了wireshark。
我创建了一个包含所有超过 636 的请求的文件
。可以在这里查看:Server1 636 traffic

最大的差距出现在:

1949 号在 1.115583 秒 - 06788 号在 14.501754 秒

6803 号在 14.64297 秒 - 11742 号在 27.921379 秒

该端口上的所有其他流量都在同一秒内发生。

注意:Server2 上的流量大致相同,但都发生在 2-3 秒之间。
可以看这里:Server2 636 流量

我运行 netstat -ano” 命令并在登录时发现以下 ldaps 连接:

原始本地地址 外部地址状态 PID
TCP 10.1.72.74:1761 10.1.72.54:636 ESTABLISHED 3688
TCP 10.1.72.74:1800 10.1.72.54:636 ESTABLISHED 3688
TCP 10.1.72.74:1825 10.1.72.54:636 ESTABLISHED 3668

4

3 回答 3

2

看看我在ServerFault上的回答...

该服务可能无法访问:

C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

您的提及:

日期:2013 年 3 月 25 日时间:上午 10:11:06 来源:Schannel “尝试访问 SSL 客户端凭据私钥时发生致命错误。

使它成为可能。

于 2013-04-03T08:19:47.903 回答
1

PrincipalContextValidateCredentials方法基本上是 LDAP 绑定操作的包装器。为此要阅读的两篇关键文章是IADsOpenDSObject::OpenDSObjectLDAP ADsPath

您正在使用 SSL,因此您需要指定是否希望它尽可能高效。ContextOptions关于该方法参数的文档ValidateCredentials实际上听起来不支持这一点:

一个或多个 ContextOptions 枚举值的组合用于绑定到服务器的选项。此参数只能指定带或不带 SSL 的简单绑定,或协商绑定。

假设我误解了文档并且该ValidateCredentials方法确实支持指定Negotiate | SecureSocketLayer,您需要查看如何发送用户名。在 OpenDSObject 文章中,它给出了关于用户名格式的建议:

您可以将 lpszUserName 作为以下字符串之一传入:

  1. 用户帐户的名称,例如“jeffsmith”。要单独使用用户名,您必须仅在 lnReserved 参数中设置 ADS_SECURE_AUTHENTICATION 标志。

  2. 来自以前版本的 Windows NT 的用户路径,例如“Fabrikam\jeffsmith”。

  3. 专有名称,例如“CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com”。要使用 DN,lnReserved 参数必须为零,或者必须包含 ADS_USE_SSL 标志

  4. 用户主体名称 (UPN),例如“jeffsmith@Fabrikam.com”。要使用 UPN,您必须为目标用户对象的 userPrincipalName 属性分配适当的 UPN 值。

您正在设置 SSL 标志,因此您必须使用 2、3 或 4。

PS 在您的示例代码中,您在构造函数中指定域的 DNS 名称。如果您在真实代码中指定服务器,则需要添加ServerBind标志。

于 2013-04-02T19:17:02.070 回答
1

检查注册表项以查看支持的 SSL/TLS 版本;可能导致握手问题的问题...(请参阅下面给出的链接中的场景 5)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

对于某些相关场景及其解决方案,请阅读疑难解答 ssl 相关问题服务器证书

于 2013-03-28T11:48:56.760 回答