安全LDAP身份验证问题

时间:2013-03-25 13:32:06

标签: c# authentication iis-7 ldap iis-6

我在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

3 个答案:

答案 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)

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

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

  

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

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

  

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

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

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

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

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

  8.   

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

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