LdapConnection 与 PrimaryContext

2024-02-14

我有以下两种使用 LDAP 和 LDAPS 验证用户身份的实现,我想知道哪个更好/更正确。郑重声明,这两种方法都适用于 SSL 和非 SSL 连接。

我也很好奇,因为当在 Wireshark 上观看时Non-SSL PrincipalContext版本中,我仍然看到端口 636 上的流量。在四种组合中(Non-SSL LdapConnection, SSL LdapConnection, Non-SSL PrincipalContext, SSL PrincipalContext)它是唯一一个在端口 389 和 636 上都有流量的端口,而不仅仅是其中之一。可能是什么原因造成的?

LDAP连接方法:

bool userAuthenticated = false;
var domainName = DomainName;

if (useSSL)
{
  domainName = domainName + ":636";
}

try
{
  using (var ldap = new LdapConnection(domainName))
  {
    var networkCredential = new NetworkCredential(username, password, domainName);
    ldap.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback((con, cer) => true);
    ldap.SessionOptions.SecureSocketLayer = useSSL;
    ldap.SessionOptions.ProtocolVersion = 3;
    ldap.AuthType = AuthType.Negotiate;
    ldap.Bind(networkCredential);
  }

  // If the bind succeeds, we have a valid user/pass.
  userAuthenticated = true;
}
catch (LdapException ldapEx)
{
  // Error Code 0x31 signifies invalid credentials, anything else will be caught outside.
  if (!ldapEx.ErrorCode.Equals(0x31))
  {
    throw;
  }
}

return userAuthenticated;

主体上下文方法:

bool userAuthenticated = false;
var domainName = DomainName;

if (useSSL)
{
  domainName = domainName + ":636";
  ContextOptions options = ContextOptions.SimpleBind | ContextOptions.SecureSocketLayer;

  using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName, null, options))
  {
    userAuthenticated = pc.ValidateCredentials(username, password, options);
  }
}
else
{
  using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName))
  {
    userAuthenticated = pc.ValidateCredentials(username, password);
  }
}

return userAuthenticated;

@DTI-Matt,在上面的示例中,您使用VerifyServerCertificate总是返回的回调true。从本质上讲,这违背了通过 SSL 连接到 LDAP 的目的,因为没有执行真正的证书检查。

虽然您可以使用以下方法实现真正​​的证书检查X509Chain and/or X509Certificate2类,看来PrincipalContext为您处理支票。

总而言之,两者LdapConnection and PrincipalContext提供非常相似的功能,通过普通或 SSL 连接连接到 LDAP 服务器。你必须提供LdapConnection更多的手写代码才能正常工作。另一方面,PrincipalContext为您提供相同的功能,而需要手动编写的代码更少。

请注意,通过非 SSL 连接到端口 636(通过 SSL 的默认 LDAP 端口)PrincipalContext可以通过以下事实来解释:此类尝试尽可能安全地连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LdapConnection 与 PrimaryContext 的相关文章

  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • javax.net.ssl.SSLException:没有可用的 PSK。无法恢复

    我正在使用 Jetty 客户端发送传出请求 在 Java 10 下完美运行的代码在 Java 11 下突然出现以下异常 javax net ssl SSLException No PSK available Unable to resume
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 生成 .tail IL 指令的简单 F# 代码是什么?

    我想看看 tailIL 指令 但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环 我实际上是在猜测这一点 因为我不完全确定反射器中的循环是什么样的 我绝对没有看到任何 tail不过操作码 我在项目的属性中检查了 生成尾部调用 我还尝
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) 存在性能问题?

    LDAP 搜索有一些内置规则 其中之一是LDAP MATCHING RULE IN CHAIN From MSDN https msdn microsoft com en us library aa746475 v vs 85 aspx 1
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面

随机推荐

  • Android:MediaPlayer 视频宽高比问题

    我遇到一个无法解决的问题 我正在使用 MediaPlayer 类来播放视频 但是 我总是失去原始的纵横比 这里提到了媒体播放器代码和xml代码 我已经尝试了很多方法但仍然无法解决问题 我需要保持原始的宽高比 我已在 Android 清单文件
  • 按字母顺序排列的列表,轨道上有 ruby

    我正在构建一个按字母顺序排序的列表 并正在寻找一种解决方案来获取数据库结果并按字母顺序排序 任何帮助是极大的赞赏 在上面的nduks的基础上 我喜欢 公司 rb def initial return if name blank name 0
  • Firestore:文档父名称缺少“/”

    我正在使用 jest 对 firestore 执行集成测试 我期望收到包含等于 field1 和 field2 的字段的文档 但是 我收到了以下错误 我尝试在 firecase 控制台中创建复合索引 但问题仍然存在 这种情况似乎只在测试期间
  • Django:分配外键 - 无法获取类的代表

    我在这里问这个问题是因为 在我的搜索中 这个错误通常与查询有关 而不是与外键分配有关 我收到的错误发生在模型的方法中 这是代码 class Deal models Model model fields def update existing
  • 为什么 Node.js 异步模块在使用 async.eachLimit(array, limit, function, callback) 的第一步后停止?

    如果我使用这段代码 async eachLimit body photos photo 10 function photo var flickr getphoto path request get url flickr host url f
  • 从命令行检测 Apple Silicon

    如何从 shell 脚本中检测到它正在 M1 Apple 硬件上运行 我希望能够运行命令行命令 以便我可以编写if 其主体仅在具有 M1 处理器的 Mac 上运行时才会执行 当然至少是 macOS Big Sur uname m 将返回ar
  • CMake找不到NVIDIA的opencl sdk

    我刚刚安装了 NVIDIA CUDA 工具套件 用它在 Windows 8 1 上开发 OpenCL 应用程序 我遇到了一些问题 1 FinedOpenCl cmake 不起作用 因为 Nvidia 工具包未设置 opencl dir cm
  • PHP:XML 文件到字符串,使用 asXML() 的 file_get_contents 或 simplexml_load_file 更快

    我正在编写一个代理服务来缓存我的移动应用程序对网络服务进行的查询 就像中间的一个人 我构建的代理站点的任务是将其从应用程序获取的查询传递到第三方 Web 服务 并将来自第三方 Web 服务的响应保存为 XML 文件 并为同一查询的所有后续调
  • 隐式类型转换优先级是如何确定的?

    这是代码 class A public int val char cval A val 10 cval a operator char const return cval operator int const return val int
  • 无法使用 PowerMockito/Mockito 模拟 URL 类

    我正在尝试使用 PowerMockito 来模拟我正在测试的代码中 java net URL 类的创建 基本上 我想防止发生真正的 HTTP 请求 而是 1 在发出请求时检查数据 2 在模拟响应上提供我自己的测试数据 这就是我正在尝试的 R
  • awk 中比较连续行

    我想使用 awk 命令比较文件中的连续行 这是输入和输出的示例 输入文件 6 7 8 9 10 4 5 6 我想要的输出文件是这样的 6 7 8 9 10 14 15 16 基本上我想比较当前行是否大于前一行 并继续打印前一行和当前行 一旦
  • 如何采取行动关闭 NSPopover?

    您好 我在我的一个应用程序中实现了 NSPopover 但弹出窗口不会关闭 我猜一旦我单击其他内容 它应该关闭 但事实并非如此 我知道有一个关闭弹出窗口操作 但这只适用于不同的按钮 当我按下同一按钮时 如何才能看到弹出窗口已打开以及何时打开
  • 使用泛型从枚举中获取最大值

    如何使用泛型从枚举中获取最大 int 值 我已尝试以下操作 但它显示以下编译错误 无法将 T 隐式转换为 int int maxValue GetMaxValue
  • 如何在 2019.3 中删除我的 IntelliJ 许可证?

    我安装了 JetBrains IntelliJ 如何删除许可证设置 我可以在以下位置找到许可证详细信息Help gt Register 菜单 但这不允许我删除许可证设置或输入无效数据 例如不存在的许可证服务器 用例 我安装了一个许可证服务器
  • 是否可以在 Spring MVC REST 端点中验证 @RequestParam?

    在 Jersey 2 中可以这样做 GET PATH user email public IDto getUser NotNull Email PathParam email String validEmail return userMan
  • 如何将列表转换为队列来实现先进先出

    考虑 public List
  • 数组公式中当前行中的 COUNTA (Google 表格)

    我有一个具有固定数量的列和动态行的 Google 工作表 我喜欢使用 countA 来计算当前行中具有值 非空白 的字段 我找到了一个公式在这里 https productforums google com forum topic docs
  • Android权限保护级别18和50

    当我转储 Nexus 7 上所有应用程序的所有权限时 我 如预期 获得保护级别为 0 正常 1 危险 2 签名 的权限 3 SIGNATURE OR SYSTEM 以下没有任何记录 但也有很多权限的保护级别设置为 18 有些权限设置为 50
  • 相机在 android 2.2 上不工作

    在Android SDK和AVD Manager中 我创建了一个新的android虚拟设备 如下所示 姓名 myavd 目标 Android 2 2 API 级别 8 SD 卡 50MiB 内置 默认 HVGA 硬件 抽象 LCD 密度 1
  • LdapConnection 与 PrimaryContext

    我有以下两种使用 LDAP 和 LDAPS 验证用户身份的实现 我想知道哪个更好 更正确 郑重声明 这两种方法都适用于 SSL 和非 SSL 连接 我也很好奇 因为当在 Wireshark 上观看时Non SSL PrincipalCont