如何使用 System.DirectoryServices.Protocol 验证用户名/密码?

5 c# directoryservices novell

首先,我无法使用Active Directory,因此无法System.DirectoryServices直接使用。这将是一台向仅System.DirectoryServices.Protocol受支持的 Novell 网络发送查询的 PC。

我非常确定我需要提供正确的 SearchRequest。

这是我到目前为止所拥有的:

private static String _certificatePath;
private static String _server;

private static SearchResponse Query(String user, String pwd, out String error)
{
    SearchResponse result = null;
    error = String.Empty;
    if (File.Exists(_certificatePath))
    {
        var identifier = new LdapDirectoryIdentifier(_server, false, false);
        try
        {
            using (var connection = new LdapConnection(identifier))
            {
                connection.SessionOptions.ProtocolVersion = 3;
                var cert = new X509Certificate();
                cert.Import(_certificatePath, null, X509KeyStorageFlags.DefaultKeySet);
                connection.ClientCertificates.Add(cert);
                connection.AuthType = AuthType.External;
                connection.AutoBind = false;
                var request = new SearchRequest()
                {
                    DistinguishedName = user, //Find this person
                    Filter = "(objectClass=*)", //The type of entry we are looking for
                    Scope = System.DirectoryServices.Protocols.SearchScope.Subtree, //We want all entries below this ou
                };
                result = (SearchResponse)connection.SendRequest(request); //Run the query and get results
            }
        } catch (Exception err)
        {
            error = String.Format("SDSP::Query {0}: {1}", err.GetType(), err.Message);
        }
    }
    else
    {
        error = "The system cannot find the Cryptography Certificate at the path specified in the Application Configuration file.";
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如何创建SearchRequest来验证user/pwd组合?

var request = new SearchRequest()
{
    DistinguishedName = user, //Find this person
    Filter = "(objectClass=*)", //The type of entry we are looking for
    Scope = System.DirectoryServices.Protocols.SearchScope.Subtree, //We want all entries below this ou
};
Run Code Online (Sandbox Code Playgroud)

小智 2

在 Windows 上

您可以附加ContextOptions.Negotiate参数ValidateCredentials(用户名和密码)。

const int ldapErrorInvalidCredentials = 0x31;

const string server = "sd.example.com:636";
const string domain = "sd.example.com";

try
{
    using (var ldapConnection = new LdapConnection(server))
    {
        var networkCredential = new NetworkCredential(_username, _password, domain);
        ldapConnection.SessionOptions.SecureSocketLayer = true;
        ldapConnection.AuthType = AuthType.Negotiate;
        ldapConnection.Bind(networkCredential);
    }

    // If the bind succeeds, the credentials are valid
    return true;
}
catch (LdapException ldapException)
{
    // Invalid credentials throw an exception with a specific error code
    if (ldapException.ErrorCode.Equals(ldapErrorInvalidCredentials))
    {
        return false;
    }

    throw;
}
Run Code Online (Sandbox Code Playgroud)

资料来源:


在 Novell 上

DirectoryEntryDirectorySearcher都是高级类工具,它们是 Active Directory 的包装器。

//use the users credentials for the query
DirectoryEntry root = new DirectoryEntry(
    "LDAP://dc=domain,dc=com", 
    loginUser, 
    loginPassword
    );

//query for the username provided
DirectorySearcher searcher = new DirectorySearcher(
    root, 
    "(sAMAccountName=" + loginUser + ")"
    );    

//a success means the password was right
bool success = false; 
try {
    searcher.FindOne();
    success = true;
}
catch {
    success = false;
}
Run Code Online (Sandbox Code Playgroud)

参考了答案

  • 该死。[DirectoryEntry](https://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.aspx) 和 [DirectorySearcher](https://msdn.microsoft.com/en-us/library/system .directoryservices.directorysearcher.aspx)都是高级类工具,它们是 Active Directory 的包装器。它们不在 [System.DirectoryServices.Protocols](https://msdn.microsoft.com/en-us/library/system.directoryservices.protocols.aspx) 命名空间中。我无法使用这个答案。 (2认同)