Sorry, in the above code the section
if (name != null) {
            try {
                if (debug) {
                    log.debug("Cache hit. Using DN " + name);
                }
                bValue = this.bindAsUser(userName,name, (String)
credential);
            } catch (NamingException e) {
                // do nothing if bind fails since we check for other DN
                // patterns as well.
                if (log.isDebugEnabled()) {
                    log.debug("Checking authentication with UserDN " + name
+ "failed " +
                            e.getMessage(), e);
                }
            }

            return bValue;

        }
 should be changed as

if (name != null) {
            try {
                if (debug) {
                    log.debug("Cache hit. Using DN " + name);
                }
                bValue = this.bindAsUser(userName,name, (String)
credential);
            } catch (NamingException e) {
                // do nothing if bind fails since we check for other DN
                // patterns as well.
                if (log.isDebugEnabled()) {
                    log.debug("Checking authentication with UserDN " + name
+ "failed " +
                            e.getMessage(), e);
                }
            }

         if(bValue){
          return bValue;
         }
        }



On Thu, Jun 25, 2015 at 6:11 PM, Damith Senanayake <[email protected]> wrote:

> in org.wso2.carbon.user.core.ldap.ReadOnlyLDAPUserStoreManager.java, the
> following section follows a logic as
>
> 1. Check cache for user RDN
> -a) if RDN in cache, try authentication with User Store, and return true
> if successful,
> -b) if RDN in cache and authentication fails, continue,
>
> 2.  Try creating user RDN from UserDN Patterns, and attempt authentication
> 3. If UserDN patterns are null,  try authentication from UserBase, and
> attempt authentication.
>
> The code is as below
>
>  boolean debug = log.isDebugEnabled();
>
>         if (userName == null || credential == null) {
>             return false;
>         }
>
>         userName = userName.trim();
>
>         String password = (String) credential;
>         password = password.trim();
>
>         if (userName.equals("") || password.equals("")) {
>             return false;
>         }
>
>         if (debug) {
>             log.debug("Authenticating user " + userName);
>         }
>
>         boolean bValue = false;
>         // check cached user DN first.
>         String name = userCache.get(userName);
>         if (name != null) {
>             try {
>                 if (debug) {
>                     log.debug("Cache hit. Using DN " + name);
>                 }
>                 bValue = this.bindAsUser(userName,name, (String)
> credential);
>             } catch (NamingException e) {
>                 // do nothing if bind fails since we check for other DN
>                 // patterns as well.
>                 if (log.isDebugEnabled()) {
>                     log.debug("Checking authentication with UserDN " +
> name + "failed " +
>                             e.getMessage(), e);
>                 }
>             }
>
>             return bValue;
>
>         }
>
>         // read list of patterns from user-mgt.xml
>         String patterns =
> realmConfig.getUserStoreProperty(LDAPConstants.USER_DN_PATTERN);
>
>         if (patterns != null && !patterns.isEmpty()) {
>
>             if (debug) {
>                 log.debug("Using UserDNPatterns " + patterns);
>             }
>
>             // if the property is present, split it using # to see if
> there are
>             // multiple patterns specified.
>             String[] userDNPatternList = patterns.split("#");
>             if (userDNPatternList.length > 0) {
>                 for (String userDNPattern : userDNPatternList) {
>                     name = MessageFormat.format(userDNPattern,
>
> escapeUsernameSpecialCharacters(userName,true));
>                     if (debug) {
>                         log.debug("Authenticating with " + name);
>                     }
>                     try {
>                         if (name != null) {
>                             bValue = this.bindAsUser(userName, name,
> (String) credential);
>                             if (bValue) {
>                                 userCache.put(userName, name);
>                                 break;
>                             }
>                         }
>                     } catch (NamingException e) {
>                         // do nothing if bind fails since we check for
> other DN
>                         // patterns as well.
>                         if (log.isDebugEnabled()) {
>                             log.debug("Checking authentication with UserDN
> " + userDNPattern +
>                                     "failed " + e.getMessage(), e);
>                         }
>                     }
>                 }
>             }
>         } else {
>             name = getNameInSpaceForUserName(userName);
>             try {
>                 if (name != null) {
>                     if (debug) {
>                         log.debug("Authenticating with " + name);
>                     }
>                     bValue = this.bindAsUser(userName, name, (String)
> credential);
>                     if (bValue) {
>                         userCache.put(userName, name);
>                     }
>                 }
>             } catch (NamingException e) {
>                 String errorMessage = "Cannot bind user : " + userName;
>                 if (log.isDebugEnabled()) {
>                     log.debug(errorMessage, e);
>                 }
>                 throw new UserStoreException(errorMessage, e);
>             }
>         }
>
>         return bValue;
>
> For every failed attempt, two of the highlighted bindings will occur.
>
> By following this logic, in the case of a failed attempt, we make two
> authentication requests to the LDAP/AD user-store (as both
> ReadWriteLDAPUserStoreManager.java and ActiveDirectoryUserStoreManager.java
> are both extended from this).
> If a user configures an AD to lock users on failed attempts (not by
> configuring the IS or the Identity management policy), each failed attempt
> would account for two failed attempts although the user will only see one
> (this means the account will be locked in half the allowed attempts for the
> users).
>
> Why do we need to check again if the authentication fails when we draw
> from the cache? Couldn't we remove this redundancy by either removing the
> redundant check if the authentication from cached username fails or avoid
> checking the cache altogether?
>
> Thanks in advance
>
>
>
> --
> *-Damith Senanayake-*
> +94712205272
>



-- 
*-Damith Senanayake-*
+94712205272
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to