Escape ldap search filter / Active Directory

Date: 2016-12-16
///

/// Escapes the LDAP search filter to prevent LDAP injection attacks.
///
///The search filter. 
public static string EscapeLdapSearchFilterParam(string searchFilter) {
        StringBuilder escape = new StringBuilder();
        for (int i = 0; i < searchFilter.Length; ++i) {
                char current = searchFilter[i];
                switch (current) {
                case '\\': escape.Append(@"\5c"); break;
                case '*': escape.Append(@"\2a"); break;
                case '(': escape.Append(@"\28"); break;
                case ')': escape.Append(@"\29"); break;
                case '\u0000': escape.Append(@"\00"); break;
                case '/': escape.Append(@"\2f"); break;
                default: escape.Append(current); break;
                }
        }
        return escape.ToString();
}
public bool Authenticate(string userName, string password) {
        bool authentic = false;
        try {
                DirectoryEntry entry = new DirectoryEntry(this.LdapPath, userName, password);
                object nativeObject = entry.NativeObject; authentic = true;
        } catch (DirectoryServicesCOMException) { throw; }
        return authentic;
}
public void ChangePassword(string userName, string currentPassword, string newPassword) {
        try {
                DirectoryEntry directionEntry = new DirectoryEntry(this.LdapPath, userName, currentPassword);
                if (directionEntry != null) {
                        DirectorySearcher search = new DirectorySearcher(directionEntry);
                        search.Filter = "(SAMAccountName=" + EscapeLdapSearchFilterParam(userName) + ")";
                        SearchResult result = search.FindOne();
                        if (result != null) {
                                DirectoryEntry userEntry = result.GetDirectoryEntry();
                                if (userEntry != null) {
                                        userEntry.Invoke("ChangePassword", new object[] { currentPassword, newPassword });
                                        userEntry.CommitChanges();
                                }
                        }
                }
        } catch (Exception ex) {
                throw ex;
        }
}
public void ResetPassword(string userDn, string password) {
        DirectoryEntry uEntry = new DirectoryEntry(userDn);
        uEntry.Invoke("SetPassword", new object[] { password });
        uEntry.Properties["LockOutTime"].Value = 0;

        //unlock account
        uEntry.Close();
}
5510cookie-checkEscape ldap search filter / Active Directory