使用 c# .NET 客户端连接或访问 Okta LDAP 接口
Connecting or Accessing Okta LDAP Interface using c# .NET Client
我有一个使用 Okta LDAP 接口工具的客户端。我们有一个与 AD 连接的 LDAP v3 工具,打开 LDAP 其他支持 LDAP v3 的服务器。
我们希望将 Okta LDAP 接口集成到我们的工具中,因为它与 LDAPv3 兼容。我们的代码基于 .NET 框架 + C Sharp。
我们在使用 Okta LDAP 接口连接时遇到一些 issues/challenges。
我们目前使用微软提供的微软库System.DirectoryServices。但面临 LDAP 接口问题。
为StartTLS/389
我收到错误:
不愿意表演。 LDAP 错误代码 53
更多:无法建立安全连接。致管理员:此服务需要 TLS。 LDAP
对于SSL/636
错误:服务器无法运行。
链接:
https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=netframework-4.8
https://ldapwiki.com/wiki/LDAP_UNWILLING_TO_PERFORM
var oktaLDAPPath = "LDAP://dev-506668.ldap.oktapreview.com:636/ou=users,dc=dev-506668,dc=oktapreview,dc=com";
var un = "uid=*******,dc=dev-506668,dc=oktapreview,dc=com";
var pass = "*******";
var filter = "((objectClass=*))";
try
{
using (var userDirectoryEntry = new DirectoryEntry(oktaLDAPPath, un, pass,AuthenticationTypes.SecureSocketsLayer))
{
using (var directorySearcher = new DirectorySearcher(userDirectoryEntry, filter) { PageSize = 100 })
{
directorySearcher.FindOne();
}
}
}
catch (DirectoryServicesCOMException dex)
{
}
catch (Exception ex)
{
}
谢谢
更新: 所以我自己做了一些测试。我看看是怎么回事。
如果你对 op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com
执行 DNS lookup on dev-506668.ldap.oktapreview.com
, it gives you a CNAME 结果。
浏览器将使用 CNAME 的 IP 地址,但仍会使用您最初提供的主机名发出请求。但是,出于某种原因,在启动 LDAP 连接时,Windows 正在使用 CNAME 来启动连接。
换句话说,Windows是将请求更改为LDAP://op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com:636
。但是随后它收到了名称为 *.ldap.oktapreview.com
的 SSL 证书,并且由于该名称与发出请求时使用的名称 (op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com
) 不匹配而出现恐慌。
我使用 Wireshark 验证了所有这些,监控端口 636 上的流量。SSL Client Hello 使用 op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com
而不是 dev-506668.ldap.oktapreview.com
。
我不知道有什么方法可以让它不那样做。 DirectoryEntry
也无法覆盖它验证 SSL 证书的方式。 LdapConnection
does, which you can see here,但使用起来可能有点困难。我从来没有用过它。 (你可能应该一些自己的验证,而不是像那个例子那样只是return true
)。
这可能是您可以与 Okta 支持人员分享的内容。
原回答:
听起来您的计算机不信任服务器上使用的 SSL 证书。为了验证这一点,我使用 Chrome。你必须这样开始 Chrome:
chrome.exe --explicitly-allowed-ports=636
那你就可以在地址栏里输入:
https://dev-506668.ldap.oktapreview.com:636
如果证书不受信任,您会收到一个很大的错误提示。您可以单击 'Advanced' 按钮查看 Chrome 给出的不被信任的原因。但是 Chrome 也会让您通过单击地址左侧地址栏中的 "Not secure" 来检查证书,然后单击 'Certificate'。
它可能不受信任的几个原因:
- 您使用的 fully-qualified 域名 (
dev-506668.ldap.oktapreview.com
) 与证书上的不匹配。如果是这种情况,您也许可以只更改用于匹配证书的域名。
- 该证书不是由受信任的机构颁发的。它可能是 self-signed 证书。如果是这种情况,那么您在查看证书时应该会看到一个 "Install Certificate" 按钮,您可以使用它来明确信任该证书。请参阅 here 的屏幕截图,从第 3 步开始。这将仅适用于当前计算机。
我有一个使用 Okta LDAP 接口工具的客户端。我们有一个与 AD 连接的 LDAP v3 工具,打开 LDAP 其他支持 LDAP v3 的服务器。
我们希望将 Okta LDAP 接口集成到我们的工具中,因为它与 LDAPv3 兼容。我们的代码基于 .NET 框架 + C Sharp。
我们在使用 Okta LDAP 接口连接时遇到一些 issues/challenges。
我们目前使用微软提供的微软库System.DirectoryServices。但面临 LDAP 接口问题。
为StartTLS/389
我收到错误:
不愿意表演。 LDAP 错误代码 53
更多:无法建立安全连接。致管理员:此服务需要 TLS。 LDAP
对于SSL/636
错误:服务器无法运行。
链接:
https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=netframework-4.8
https://ldapwiki.com/wiki/LDAP_UNWILLING_TO_PERFORM
var oktaLDAPPath = "LDAP://dev-506668.ldap.oktapreview.com:636/ou=users,dc=dev-506668,dc=oktapreview,dc=com";
var un = "uid=*******,dc=dev-506668,dc=oktapreview,dc=com";
var pass = "*******";
var filter = "((objectClass=*))";
try
{
using (var userDirectoryEntry = new DirectoryEntry(oktaLDAPPath, un, pass,AuthenticationTypes.SecureSocketsLayer))
{
using (var directorySearcher = new DirectorySearcher(userDirectoryEntry, filter) { PageSize = 100 })
{
directorySearcher.FindOne();
}
}
}
catch (DirectoryServicesCOMException dex)
{
}
catch (Exception ex)
{
}
谢谢
更新: 所以我自己做了一些测试。我看看是怎么回事。
如果你对 op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com
执行 DNS lookup on dev-506668.ldap.oktapreview.com
, it gives you a CNAME 结果。
浏览器将使用 CNAME 的 IP 地址,但仍会使用您最初提供的主机名发出请求。但是,出于某种原因,在启动 LDAP 连接时,Windows 正在使用 CNAME 来启动连接。
换句话说,Windows是将请求更改为LDAP://op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com:636
。但是随后它收到了名称为 *.ldap.oktapreview.com
的 SSL 证书,并且由于该名称与发出请求时使用的名称 (op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com
) 不匹配而出现恐慌。
我使用 Wireshark 验证了所有这些,监控端口 636 上的流量。SSL Client Hello 使用 op1-ldapi-fb96b0a1937080bd.elb.us-east-1.amazonaws.com
而不是 dev-506668.ldap.oktapreview.com
。
我不知道有什么方法可以让它不那样做。 DirectoryEntry
也无法覆盖它验证 SSL 证书的方式。 LdapConnection
does, which you can see here,但使用起来可能有点困难。我从来没有用过它。 (你可能应该一些自己的验证,而不是像那个例子那样只是return true
)。
这可能是您可以与 Okta 支持人员分享的内容。
原回答:
听起来您的计算机不信任服务器上使用的 SSL 证书。为了验证这一点,我使用 Chrome。你必须这样开始 Chrome:
chrome.exe --explicitly-allowed-ports=636
那你就可以在地址栏里输入:
https://dev-506668.ldap.oktapreview.com:636
如果证书不受信任,您会收到一个很大的错误提示。您可以单击 'Advanced' 按钮查看 Chrome 给出的不被信任的原因。但是 Chrome 也会让您通过单击地址左侧地址栏中的 "Not secure" 来检查证书,然后单击 'Certificate'。
它可能不受信任的几个原因:
- 您使用的 fully-qualified 域名 (
dev-506668.ldap.oktapreview.com
) 与证书上的不匹配。如果是这种情况,您也许可以只更改用于匹配证书的域名。 - 该证书不是由受信任的机构颁发的。它可能是 self-signed 证书。如果是这种情况,那么您在查看证书时应该会看到一个 "Install Certificate" 按钮,您可以使用它来明确信任该证书。请参阅 here 的屏幕截图,从第 3 步开始。这将仅适用于当前计算机。