You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求可替代DirSyncRequestControl的标准LDAP控件(支持起始时间参数)

替代AD DirSyncRequestControl的标准LDAP方案

1. 标准Persistent Search控件自定义实现(支持Cookie续传)

虽然.NET没有内置Persistent Search的封装控件,但你可以自行实现DirectoryControl子类适配标准OID(2.16.840.1.113730.3.4.3)。Persistent Search本身支持同步状态Cookie(和AD的DirSync Cookie功能一致),IBM LDAP完全兼容该机制,重启时传入之前持久化的Cookie,就能从上次中断的位置继续接收变更。

自定义Persistent Search控件代码示例

public class PersistentSearchRequestControl : DirectoryControl
{
    private const string PersistentSearchOid = "2.16.840.1.113730.3.4.3";

    public PersistentSearchRequestControl(
        int changeTypes,
        bool changesOnly,
        bool returnECs,
        byte[] cookie = null)
        : base(
            PersistentSearchOid,
            EncodeControlValue(changeTypes, changesOnly, returnECs, cookie),
            true,
            false)
    {
    }

    private static byte[] EncodeControlValue(int changeTypes, bool changesOnly, bool returnECs, byte[] cookie)
    {
        // 按照ASN.1 DER规范编码控件参数
        using (var ms = new MemoryStream())
        using (var writer = new BinaryWriter(ms))
        {
            // 编码ChangeTypes(整数:新增/修改/删除的组合)
            writer.Write((byte)0x02);
            writer.Write((byte)0x04);
            writer.Write(IPAddress.HostToNetworkOrder(changeTypes));

            // 编码ChangesOnly(布尔值:仅返回变更而非全量数据)
            writer.Write((byte)0x01);
            writer.Write((byte)0x01);
            writer.Write((byte)(changesOnly ? 0xFF : 0x00));

            // 编码ReturnECs(布尔值:返回变更类型控件)
            writer.Write((byte)0x01);
            writer.Write((byte)0x01);
            writer.Write((byte)(returnECs ? 0xFF : 0x00));

            // 编码Cookie(可选:续传时传入上次保存的字节数组)
            if (cookie != null && cookie.Length > 0)
            {
                writer.Write((byte)0x04);
                writer.Write((byte)cookie.Length);
                writer.Write(cookie);
            }

            return ms.ToArray();
        }
    }
}

2. 时间戳补偿查询方案

如果LDAP服务器开启了变更日志(比如IBM LDAP的ibm-changelog),可以结合时间戳实现崩溃重启后的补查:

  • 持久化上次处理完成的时间戳(格式遵循LDAP通用时间格式:yyyyMMddHHmmss.0Z)
  • 重启后先执行一次时间范围搜索,获取崩溃期间的所有遗漏变更
  • 完成补查后再启动Persistent Search监听实时变更

时间范围补查代码示例

// 基于modifyTimestamp属性过滤崩溃期间的变更
var catchUpFilter = $"(&({mLdapFilter})(modifyTimestamp>={LastProcessedTime:yyyyMMddHHmmss.0Z}))";
var catchUpRequest = new SearchRequest(
    mDNSearchRoot,
    catchUpFilter,
    SearchScope.Subtree,
    mAttrsToWatch);

// 执行补查并处理遗漏数据
var catchUpResponse = (SearchResponse)mConn.SendRequest(catchUpRequest);
foreach (SearchResultEntry entry in catchUpResponse.Entries)
{
    // 复用原有变更处理逻辑
}

3. IBM LDAP专属优化方案

IBM Security Directory Server提供了IBM Directory Change Notification Control(OID:1.3.18.0.2.10.23),该控件在标准Persistent Search基础上增强了可靠性,同样支持Cookie续传机制,你可以参考IBM官方规范实现对应的自定义控件,适配性会更贴合IBM LDAP环境。


内容的提问来源于stack exchange,提问作者Stephen York

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:55:21