我有一个 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 注意我们目前的服务量非常低,因为我们处于一个小的 beta 窗口中。