2013-10-25 14 views
7

私は、LDAPとLDAPSを使用してユーザーを認証する次の2つの実装を持っています。記録のために、これらはどちらもSSL接続と非SSL接続の両方で動作します。LdapConnectionとPrincipalContextの比較

Non-SSL PrincipalContextバージョンにWiresharkのを見たとき、私はまだそれが両方のトラフィックを持っている唯一のものである4つの組み合わせ(Non-SSL LdapConnectionSSL LdapConnectionNon-SSL PrincipalContextSSL PrincipalContext)のポート636上のトラフィックを参照してくださいので、私はまた、好奇心が強いですどちらか一方の代わりにポート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方法:DTI-マット@

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; 
+0

@sindilevich答えを使ってみましたか?それについての任意の解決策? – Kiquenet

答えて

4

、上記の例では、あなたは常にtrueを返すVerifyServerCertificateコールバックを使用します。これは本質的には、実際の証明書のチェックが行われないため、SSLを介したLDAPへの接続の目的に反します。 および/またはX509Certificate2クラスを使用して実際の証明書チェックを実装することができますが、PrincipalContextがあなたのためにチェックを処理するようです。

要約すると、LdapConnectionPrincipalContextは、プレーン接続またはSSL接続を介してLDAPサーバーに接続する方法で、非常に似通った機能を提供します。適切に動作させるには、手書きのコードをLdapConnectionで提供する必要があります。一方、PrincipalContextは、少ない手間で手書きで同じ機能を提供します。

注:非SSLによるポート636(デフォルトのLDAP over SSLポート)への接続は、このクラスができるだけ安全に接続しようとしていることによって説明される場合があります。

0

これがSSL /非SSLで動作していたことです。

public bool UserValid(string username, string password, bool useSSL) 
{ 
    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); // Uses DomainName without the ":636" at all times, SSL or not. 
      ldap.SessionOptions.VerifyServerCertificate += VerifyServerCertificate; 
      ldap.SessionOptions.SecureSocketLayer = useSSL; 
      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, so return userAuthenticated as false. 
     if (!ldapEx.ErrorCode.Equals(0x31)) 
     { 
      throw; 
     } 
    } 

    return userAuthenticated; 
} 

private bool VerifyServerCertificate(LdapConnection connection, X509Certificate certificate) 
{ 
    X509Certificate2 cert = new X509Certificate2(certificate); 

    if (!cert.Verify()) 
    { 
     // Could not validate potentially self-signed SSL certificate. Prompting user to install certificate themselves. 
     X509Certificate2UI.DisplayCertificate(cert); 

     // Try verifying again as the user may have allowed the certificate, and return the result. 
     if (!cert.Verify()) 
     { 
      throw new SecurityException("Could not verify server certificate. Make sure this certificate comes from a trusted Certificate Authority."); 
     } 
    } 

    return true; 
} 
関連する問題