我在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 traffic
我运行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 3688
答案 0 :(得分:2)
在ServerFault ...
查看我的回答该服务可能无法访问:
C:\ Documents and Settings \ All Users \ Application 数据\微软\加密\ RSA \ MachineKeys的
你的提及:
日期:2013年3月25日时间:上午10:11:06来源:Schannel“致命错误 尝试访问SSL客户端凭据私有时发生 键。
很可能。
答案 1 :(得分:1)
检查注册表项条目以查看支持的SSL / TLS版本;一个可能导致握手问题的问题......(参见下面链接中的场景5)
HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \控制\ SecurityProviders \ SCHANNEL \协议
对于某些相关方案,其决议的读数为troubleshooting ssl related issues server certificate
答案 2 :(得分:1)
PrincipalContext
的ValidateCredentials
方法基本上是LDAP绑定操作的包装器。要阅读的两个关键文章是IADsOpenDSObject::OpenDSObject和LDAP ADsPath。
您正在使用SSL,因此如果您希望它尽可能高效,则需要指定。关于ContextOptions
方法的ValidateCredentials
参数的文档实际上听起来不支持这个:
一个或多个ContextOptions枚举值的组合用于绑定到服务器的选项。此参数只能指定带或不带SSL的简单绑定,或者协商绑定。
假设我误解了文档并且ValidateCredentials
方法确实支持指定Negotiate | SecureSocketLayer
,您需要查看如何发送用户名。在OpenDSObject文章中,它提供了有关用户名格式的建议:
您可以将lpszUserName作为以下字符串之一传递:
用户帐户的名称,例如“jeffsmith”。要单独使用用户名,必须在lnReserved参数中仅设置ADS_SECURE_AUTHENTICATION标志。
以前版本的Windows NT的用户路径,例如“Fabrikam \ jeffsmith”。
专有名称,例如“CN = Jeff Smith,OU = Sales,DC = Fabrikam,DC = Com”。要使用DN,lnReserved参数必须为零或必须包含ADS_USE_SSL标志
- 醇>
用户主要名称(UPN),例如“jeffsmith@Fabrikam.com”。要使用UPN,必须为目标用户对象的userPrincipalName属性分配适当的UPN值。
您正在设置SSL标记,因此您必须使用2,3或4。
P.S。在示例代码中,您将在构造函数中指定域的DNS名称。如果您在实际代码中指定服务器,则需要添加ServerBind
标志。