1

我的应用程序获取当前登录的用户并使用 DirectoryServices.DirectorySearcher 来提取一些关于他们的额外详细信息(我们存储在一些自定义 AD 字段中的一些属性,以及他们的电子邮件地址)。这很好用,虽然我一直觉得它有点慢——我的单线程代码每秒只能向 AD 发出大约 2-3 个请求。

当我将此代码移至 Web 服务器时,真正的问题出现了。有多个同时用户,每秒请求的数量会大大增加,并且 LSASS.EXE 进程挂在我的服务器上。我检查了域控制器,它们都很好——瓶颈显然在应用程序端。我怀疑让我慢下来的是 NTLM/Kerberos 挑战/响应,同时请求的数量甚至与多核处理器挂钩。

我们的网络政策不允许从 AD 进行匿名读取,因此没有选择。此外,我已经尝试了“AuthenticationTypes”的每个成员(在示例中,我使用的是 .FastBind),但它们似乎都具有大致相同的吞吐率和相同的处理器负载。

有人知道我如何解决这个限制并降低对处理器的要求吗?

这是我正在使用的代码 - 非常简单:

Dim sPath As String = "LDAP://" & stringUserDN
Dim entry As New DirectoryEntry(sPath)
entry.AuthenticationType = AuthenticationTypes.FastBind

For Each stringADNumber As String In entry.Properties(_ADPROP_EMPLOYEENUMBER)
    'return first item
    Return Convert.ToInt32(stringADNumber)
Next

Return String.Empty
4

1 回答 1

1

我没有大量在 AD 中查找项目的经验。但是,一个建议是您可能希望在 HttpContext 中检查请求。发出请求的当前用户有一些基本信息,例如组、SID 和令牌信息。我不相信默认情况下有一个电子邮件地址字段,但您也许可以使用该User.Name属性+ "@your.domain"来建立一个电子邮件地址。

为了显示此数据,您需要 IIS 要求对请求进行身份验证。匿名用户不会填充此数据。此数据的访问器是HttpContext.Current.Request.LogonUserIdentity,或者,在您的页面背后的代码中,您可以this.Request.LogonUserIdentity简称为。

希望这会有所帮助。祝你好运。

于 2009-02-23T20:45:04.250 回答