PrimaryContext LDAPS 自签名证书

2024-01-03

我们有一个应用程序,使用 LDAP、通过 IP 地址、通过 VPN 隧道对远程 AD 进行身份验证,使用以下代码:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, ldap.Host, ldap.Path.Replace("/", ""), ContextOptions.Negotiate, UserName, Password))
{
    using (UserPrincipal user = UserPrincipal.FindByIdentity(pc, domainAndUsername))
    {
        if (user != null)
        {
            SAMAccountName = user.SamAccountName;
            retVal = true;
        }
    }
}

这对于普通的非 SSL LDAP 非常有效。但是,我们遇到过需要通过 SSL 连接到 LDAPS 的情况,但它不起作用。我已经在 PrimaryContext 构造函数上尝试了很多变体,但我们所做的一切都会导致连接失败,并出现以下错误:

System.DirectoryServices.AccountManagement.PrincipalServerDownException: The server could not be contacted. ---> System.DirectoryServices.Protocols.LdapException: The LDAP server is unavailable.
   at System.DirectoryServices.Protocols.LdapConnection.Connect()
   at System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(DirectoryRequest request, Int32& messageID)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
   at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
   --- End of inner exception stack trace ---
   at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
   at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password)

我们知道这不是 LDAP 服务器本身,正如所讨论的方法所尝试的那样here https://stackoverflow.com/a/10853221/1048068连接没有错误。我不太习惯使用 try...catch 进行逻辑流,并且我已经阅读了此方法的一些其他问题(例如没有正确尊重证书等),因此我尝试使用 PrimaryContext 来实现此操作。

有人可以在这里给我一些指导吗?我对这个快要疯了。

EDIT:经过进一步研究,这似乎可能是自签名证书的问题。

EDIT 2:将其分解为 X509 链调用后,我收到以下特定错误:

PartialChain 无法为受信任的根颁发机构构建证书链。

看到这一点,您可能会认为只需将 CA 添加为受信任的根即可,但这似乎并不能解决问题。


我想知道这是否代码项目文章 https://www.codeproject.com/Articles/19097/eDirectory-Authentication-using-LdapConnection-and可能有帮助:

“最近,我在使用 System.DirectoryServices.DirectoryEntry 连接到 Novell eDirectory 服务器时遇到了麻烦,因为证书是自签名的。在 ASP.NET 应用程序中运行时,不会检查计算机级证书存储。因此,即使尽管自签名证书位于受信任存储中,DirectoryEntry 仍然拒绝建立连接。

对于这种情况,LdapConnection 类是更好的选择,因为它允许用户手动验证证书。请注意,当在 Windows 窗体应用程序中运行时,DirectoryEntry 方法可以与受信任的自签名证书一起正常工作。”

通过 LdapConnection,您可以使用自己的证书身份验证,如下所示:

LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier("EDIRECTORYSERVER:636"));
con.SessionOptions.SecureSocketLayer = true;
con.SessionOptions.VerifyServerCertificate = 
   new VerifyServerCertificateCallback(ServerCallback);
con.Credential = new NetworkCredential(String.Empty, String.Empty);
con.AuthType = AuthType.Basic;

和这样的验证回调:

public static bool ServerCallback(LdapConnection connection, X509Certificate certificate)
{
  try
  {
    X509Certificate expectedCert = 
         X509Certificate.CreateFromCertFile("C:\\certificates\\certificate.cer");

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

PrimaryContext LDAPS 自签名证书 的相关文章

随机推荐

  • 如何使用 Vue.js 异步组件?

    我正在使用 Laravel 5 4 和 Vue js 2 我想使用按钮异步加载组件 我的 Vue js 组件是独立的 示例 vue and test vue 然后我将它们作为 HTML 标签加载 这是我的app js import boot
  • 为什么将对象推向向量时会被破坏?

    我想知道为什么我推回到向量中的元素会在这种情况下调用其析构函数 include
  • 为什么 {{ isNan(x) }} 在 angularJS 中不起作用?

    请注意 此问题的标题已更改为更关注确切问题的标题 请参阅评论流以了解它是如何发生的 我意识到问题是 AngularJS 似乎无法处理 isNaN 我的 HTML 中有以下内容 xx option selectedSubject yy opt
  • Hibernate API 中的 ElementCollection createAlias

    有谁知道是否以及如何解决以下问题 https stackoverflow com questions 2735071 hibernate criteria api adding a criterion string should be in
  • 为什么 Haskell(有时)被称为“最佳命令式语言”?

    我希望这个问题是切中主题的 我尝试寻找答案 但没有找到明确的答案 如果这恰好偏离主题或已经得到回答 请审核 删除它 我记得听过 读过关于 Haskell 的半开玩笑的评论最佳命令式语言几次 这当然听起来很奇怪 因为 Haskell 通常以其
  • Node.js - 为什么每个请求我的回调都会被调用 3 次?

    这是我的第一个节点应用程序 我实际上刚刚开始研究 API 来了解它的全部内容 我立即对以下服务器代码和控制台输出感到困惑 有人可以解释为什么我的 console log 在浏览器刷新时出现 3 次吗 var http require htt
  • SqlAlchemy 相当于使用 FreeTDS 的 pyodbc 连接字符串

    以下作品 import pyodbc pyodbc connect DRIVER FreeTDS Server my db server Database mydb UID myuser PWD mypwd TDS Version 8 0
  • 在 C# 中向 DateTime 添加天数

    C 可以添加日期吗 DateTime Today ToLongDateString 10 我尝试过这个 但它不起作用 您想添加天数吗 DateTime newDate DateTime Today AddDays 10 请注意 您会得到一个
  • Android 上的 wifi-direct 终端连接到对等点?

    有没有办法通过 Wifi Direct 终止与对等方的连接 我尝试了cancelConnect和removeGroup 两人都回来了 忙吗 谢谢 这是我用来断开与同伴的连接的方法 我从日志中注意到 Android 内置应用程序也使用相同的方
  • 抽屉式导航 - 禁止点击抽屉后面的项目

    有什么方法可以确保导航抽屉位于片段中内容的顶部 我使用虚拟数据创建了一个小型测试应用程序 10 个片段 带有相应的编号按钮和文本视图 问题在于片段元素似乎比导航抽屉具有更高的优先级 如屏幕截图所示 一旦我尝试打开 0 片段 它就会选择注册导
  • Bower 自动更新 Bower.json

    我使用 Bower 1 0 0 运行以下命令 mkdir testdir cd testdir bower init accept defaults bower install jquery s the s is supposed to c
  • 使用 jQuery AJAX 捕获 404 状态

    我有这个代码 ajax cache false url Admin Contents GetData data accountID AccountID success function data CityID html data error
  • Zend框架中的重定向和转发有什么区别

    Zend 框架中的重定向和转发有什么区别 什么时候应该使用重定向 什么时候应该使用转发 想象一下您在办公室接到一个电话 有人想与销售人员交谈 如果你说 请拨打123456 然后挂断 这是redirect 如果您说 稍等 并将电话转接给他们
  • C# 中的字符串基准 - 重构速度/可维护性

    我一直在用自己的时间摆弄小函数 试图找到重构它们的方法 我最近读了 Martin Fowler 的书重构 改进现有代码的设计 https rads stackoverflow com amzn click com 0201485672 我发
  • ologit 的 vglm()、orm()、polr() 和 clm() 中的系数

    我正在使用不同的软件包进行 ologit 它们是VGAM rms MASS and ordinal 使用数据集wine从包装中ordinal 首先是vglm library VGAM vglmfit lt vglm rating temp
  • 使用 jQuery 获取 XML 中的节点值

    我正在尝试解析以下 XML
  • ibpy:如何捕获从reqAccountSummary返回的数据

    我正在使用交互式代理的 ibapi 并且一般情况下我陷入了如何捕获返回数据的困境 例如 根据api docs https interactivebrokers github io tws api account summary html a
  • R - 条件增量

    这对代码来说应该是微不足道的 但无法在 R 中想到优雅的单行代码 我有一个数据框 如下所示 data lt data frame index seq 1 20 event rep 0 20 data event 10 lt 1 data e
  • 使用 leaflet 包在 R 中绘制等值线图

    我正在尝试使用 leaflet 包在 R 中创建交互式 Choropleth 地图 我的最终输出应该是这样的 当用户单击美国的任何一个州时 应该显示一个弹出窗口 其中包含州名称和相应州的震级值 下面是我正在使用的代码 我面临的问题是 每当我
  • PrimaryContext LDAPS 自签名证书

    我们有一个应用程序 使用 LDAP 通过 IP 地址 通过 VPN 隧道对远程 AD 进行身份验证 使用以下代码 using PrincipalContext pc new PrincipalContext ContextType Doma