我有一个Web应用程序,它使用ActiveDirectoryMembershipProvider类来针对安全的LDAP系统创建/更新/验证用户。一切似乎都运行良好,除了我们得到随机“服务器不可用”。例外。当用户收到此错误时,他们可以立即重试并运行。
我让我们的网络人监控流量,我们注意到Membership对象创建了2个到LDAP的安全TCP连接(我们称之为con1和con2)。两个连接似乎都保持打开状态,但只有con2接收任何通信。最终con1将从ldap服务器发送一个关闭请求。此请求似乎是以随机间隔发生的。当我们看到错误时,我们通常会在错误发生之前(毫秒之前)看到con1关闭请求。
我已经阅读了MSDN文档,但无法弄清楚为什么它会打开2个连接以及它为什么不关闭它们或发送一条通知消息,它仍然正常运行。有谁知道这些答案?
我的第二个问题是我该怎么做才能解决这个问题?我知道我可以重新请求验证,但我不希望我必须这样做。下面是示例代码。
配置
<add name="ADConnectionString" connectionString="LDAP://FullyQualifiedServerName:636/OU=XXX,DC=XXX,DC=XXX" />
<add name="ADMembershipProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ADConnectionString"
connectionUsername="CN=XXX,OU=XXX,DC=XXX,DC=XXX" connectionPassword="XXXXXX"
connectionProtection="Secure" enableSearchMethods="true" enablePasswordReset="true"
requiresQuestionAndAnswer="true" applicationName="XXXX"
description="Default AD connection" requiresUniqueEmail="false"
clientSearchTimeout="30" serverSearchTimeout="30" attributeMapPasswordQuestion="xxx"
attributeMapPasswordAnswer="xxxx" attributeMapFailedPasswordAnswerCount="xxxx"
attributeMapFailedPasswordAnswerTime="xxxx"
attributeMapFailedPasswordAnswerLockoutTime="xxxx" attributeMapEmail="mail"
attributeMapUsername="userPrincipalName" maxInvalidPasswordAttempts="7"
passwordAttemptWindow="1" passwordAnswerAttemptLockoutDuration="5"
minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0"
passwordStrengthRegularExpression="^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).{8,20}$" />
代码
return Membership.Providers["ADMembershipProvider"].ValidateUser(userName, userPassword);
环境:Windows Server 2008,IIS 7.0,.NET 4.0 注意 由于我们处于小型测试版窗口,因此我们目前的投放量非常低。
答案 0 :(得分:0)
似乎这是ActiveDirectoryMembershipProvider类中的错误。我们最终切换到Common.LdapAuth.LdapAuthProvider类来验证用户。