寻求可替代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
相关产品推荐
相关产品推荐

