首页 > 编程知识 正文

微软免费服务器(每次请求sessionid会变)

时间:2023-05-04 14:28:19 阅读:71515 作者:4390

如何处理LDAP服务器Cookie

05/31/2017

正文内容

适用范围: Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012

在LDAP中,一些查询生成较大的结果集。 这样的查询给windows服务器带来了一些挑战。

收集和构建这些大结果集是一项重要的工作。 许多属性都需要从内部表示转换为LDAP网络表示。 许多属性要求在响应帧中从内部格式(通常是二进制格式)转换为基于文本的UTF-8格式。

另一个问题是,包含数万个对象的结果的集合变大,容易达到数百兆字节。 然后,这些结果集需要大量虚拟地址空间,如果传输过程中TCP会话中断,则整个工作将会丢失,因此通过网络传输也存在问题。

由于这些容量和逻辑问题,Microsoft LDAP开发人员创建了一个称为分页查询的LDAP扩展。 实现了一个将大查询划分为多个小结果集块的LDAP控件。 已经是作为RFC 2696的RFC标准。

在客户端处理的cookie

分页方法使用在客户端或LDAP策略中设置的页面大小“最大页面大小”。 客户端必须始终发送LDAP控件以启用分页。

处理包含多个结果的查询时,将达到某个时间点允许的最大对象数。 LDAP服务器将响应消息打包,并添加包含稍后继续搜索所需信息的cookie。

客户端APP应用程序必须将cookie视为不透明的Blob。 可以检索响应中的对象数,并根据现有Cookie继续搜索。 客户端将继续搜索,方法是再次使用相同的参数(如基本对象和过滤器)将查询发送到LDAP服务器,并提供上次响应中返回的Cookie值。

如果未在页面中输入对象数,则LDAP查询完成,响应中不包含页面Cookie。 如果服务器没有返回cookie,则客户端必须识别寻呼搜索成功完成。

如果服务器返回错误,则客户端必须识别分页搜索失败。 重试搜索后,搜索将从第一页重新开始。

服务器端cookie处理

Windows Server将Cookie返回到客户端,并在某些情况下在服务器上存储与Cookie相关的信息。 此信息存储在服务器缓存中,有一些限制。

在这种情况下,从服务器发送到客户端的cookie还用于从服务器缓存中检索信息。 如果客户端继续进行分页搜索,Windows Server将继续使用客户端Cookie和服务器Cookie缓存中的相关信息进行搜索。 如果由于任何原因服务无法从服务缓存中找到相关的Cookie信息,搜索将停止并向客户端返回错误。

如何管理Cookie池

当然,LDAP服务器可以同时服务于多个客户端,并启动多个客户端使用服务器cookie缓存的查询。 因此,Windows Server在此处的实现是跟踪Cookie池的使用情况,并限制Cookie池不占用过多的资源。 管理员可以使用以下LDAP策略设置限制: 默认值和说明如下。

最小结果集: 4

如果服务器的Cookie缓存中的条目数小于MinResultSets,则LDAP服务器不会确定池的最大大小,如下所述。

maxresultsetsize:262,144字节

服务器上Cookie缓存的总大小不能超过MaxResultSetSize的最大值(以字节为单位)。 如果超过,将从最旧的Cookie中删除,直到池小于MaxResultSetSize字节,或者池中的Cookie数量小于MinResultSets值。 这意味着使用默认设置。 如果只存储了三个cookie,则LDAP服务器会认为450KB的池正常。

MaxResultSetsPerConn:10

在LDAP服务器上,池中的每个LDAP连接都不能使用超过MaxResultSetsPerConn的cookie。

处理删除的Cookie

无论如何,从LDAP伺服器快取中移除cookie资讯不会在APP应用程式中立即发生错误。 然后,APP应用程序可以在另一次尝试中从头重新启动并完成分页搜索。 一些APP应用程序使用此重试机制添加了稳健性。

某些APP应用程序可能执行页面搜索,但从未完成。 这可能会导致条目保留在LDAP服务器的Cookie缓存中。 这些条目由第4部分的机制处理。 重要的是释放服务器上活动LDAP搜索所占用的内存。

如果从服务中删除此类Cookie,并且客户端继续使用此Cookie句柄进行搜索,会发生什么? LDAP服务器在服务器的Cookie缓存中找不到Cookie,并为查询返回错误。 错误响应如下所示。

00000057: LdapErr

: DSID-xxxxxxxx, comment: Error processing control, data 0, v1db1

备注

"DSID"后面的十六进制值将因 LDAP 服务器二进制文件的生成版本而异。

关于 Cookie 池的报告

LDAP 服务器可以通过 NTDS诊断密钥 中的"16 Ldap 接口"类别记录事件。 如果将此类别设置为"2",可以获取以下事件:

Log Name: Directory Service

Source: Microsoft-Windows-ActiveDirectory_DomainService

Event ID: 2898

Task Category: LDAP Interface

Level: Information

Description:

Internal event: The LDAP server has reached the limit of the number of Result Sets it will maintain for a single connection. A stored Result Set will be discarded. This will result in a client being unable to continue a paged LDAP search.

Maximum number of Result Sets allowed per LDAP connection:

10

Current number of Result Sets for this LDAP connection:

11

User Action

The client should consider a more efficient search filter. The limit for Maximum Result Sets per Connection may also be increased.

Log Name: Directory Service

Source: Microsoft-Windows-ActiveDirectory_DomainService

Event ID: 2899

Task Category: LDAP Interface

Level: Information

Description:

Internal event: The LDAP server has exceeded the limit of the LDAP Maximum Result Set Size. A stored Result Set will be discarded. This will result in a client being unable to continue a paged LDAP search.

Number of result sets currently stored:

4

Current Result Set Size:

263504

Maximum Result Set Size:

262144

Size of single Result Set being discarded:

40876

User Action

The client should consider a more efficient search filter. The limit for Maximum Result Set Size may also be increased.

这些事件发出“已删除存储的 Cookie”的信号。 它并不意味着客户端已发现 LDAP 错误,而只是 LDAP 服务器已达到缓存的管理限制。 在某些情况下,LDAP 客户端可能已放弃分页搜索,并可能永远不会发现该错误。

监视 Cookie 池

如果你在域中从未遇到 LDAP 搜索错误,则可能从不需要监视 LDAP 服务器页搜索 Cookie 池。 如果你在环境中看到 LDAP 页搜索相关错误,则可能遇到 Cookie 池管理员限制的问题。

事件 2898 和 2899 是了解 LDAP 服务器已达到管理员限制的唯一方式。 精明的钻石因处理上述错误的控件而遇到 LDAP 查询出错时,应查看第 4 节中提到的一个或多个 LDAP 策略设置的限制是否增加,具体取决于你收到的是哪个事件。

如果你在 DC/LDAP 服务器上看到事件 2898,建议你将 MaxResultSetsPerConn 设为 25。 在单个 LDAP 连接上通常不会有超过 25 个并行分页搜索。 如果你仍看到事件 2898,请考虑调查遇到该错误的 LDAP 客户端应用程序。 怀疑是在检索后续分页结果时它不知何故停止响应了,将 Cookie 挂起,并重新启动一个新查询。 因此,请查看在某一时刻应用程序是否有足够多的 Cookie 用于其用途,你还可以将 MaxResultSetsPerConn 的值增加到超出 25。精明的钻石看到域控制器上记录的事件 2899 时,计划将会不同。 如果你的 DC/LDAP 服务器运行在具有足够内存(几 GB 的可用内存)的计算机上,建议你在 LDAP 服务器上将 MaxResultsetSize 设为 >= 250MB。 此限制已足够大,甚至可以针对非常大的目录提供大量 LDAP 页搜索。

如果你在使用 250MB 或更大容量的池时仍看到事件 2899,则你很可能正在使用许多客户端非常频繁地查询大量对象并返回这些对象。 使用 Active Directory 数据收集器集可以帮你查找使 LDAP 服务器繁忙的重复性分页查询。 这些查询将显示许多与所使用的页面大小匹配的"返回的条目"。

如果可能,应查看应用程序设计,并采用较低的频率、数据量和/或更少的客户端实例来查询此数据来实现不同的方法。对于你有权访问源代码的应用程序,本指南用于创建高效的应用程序AD-Enabled可帮助你了解应用程序访问AD 的最佳方式。

如果无法更改查询行为,一种方法也是添加更多所需的命名上下文的复制实例,然后重新分发客户端,并最终减少单个 LDAP 服务器的负载。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。