gpt4 book ai didi

c# - LdapConnection 与 PrincipalContext

转载 作者:太空狗 更新时间:2023-10-29 20:24:15 28 4
gpt4 key购买 nike

我有以下两个使用 LDAP 和 LDAPS 对用户进行身份验证的实现,我想知道哪个更好/更正确。作为记录,这两种方法都适用于 SSL 和非 SSL 连接。

我也很好奇,因为在 Non-SSL PrincipalContext 版本上使用 Wireshark 观看时,我仍然看到端口 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;

PrincipalContext 方法:

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,在上面的示例中,您使用始终返回 trueVerifyServerCertificate 回调。这实际上违背了通过 SSL 连接到 LDAP 的目的,因为没有执行真正的证书检查。

虽然您可以使用 X509Chain 和/或 X509Certificate2 类实现真正的证书检查,但似乎 PrincipalContext 会为您处理检查。

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

请注意,通过非 SSL PrincipalContext 连接到端口 636(您的默认 LDAP over SSL 端口)的原因可能是此类尝试尽可能安全地连接。

关于c# - LdapConnection 与 PrincipalContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596010/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com