Dear Ritesh Tripathi:

     Thank you again for such a wonderful reply.
     Now I have idea how to solve my problem.

     Wishing you and yours a safe, healthy, and prosperous new year!

 Sincerely
Chunyao Wang
Ritesh Tripathi 在 2021年1月1日 星期五下午4:01:04 [UTC+8] 的信中寫道:

> Dear Chun-Yao,
>
> 1. OpenLDAP offers Password policy implementation - pl see 
> https://tobru.ch/openldap-password-policy-overlay/. You don't need to opt 
> for Apache-DS as you already have openLDAP.
> 2. The CAS interacts with LDAP server using the standard - ldaptive java 
> library. https://www.ldaptive.org/
> 3. The error codes - that are given by the LDAP Server - are translated to 
> the end user messages inside CAS. Pl have a look at messages.properties 
> file inside CAS [you can get this file either by gradlew explodewar command 
> or equivalent or this file is inside tomcat\webapps\cas\WEB-INF\classes 
> path, its advisable that you follow overlay standards and keep this 
> separate like your application.properties file.] and customize the messages 
> as per your requirements [that you want the user to see]. The concerned 
> properties are 
>
> authenticationFailure.AccountDisabledException=This account has been 
> disabled.
> authenticationFailure.AccountLockedException=This account has been locked.
> authenticationFailure.AccountExpiredException=This account has expired and 
> is forbidden to login at this time.
> authenticationFailure.CredentialExpiredException=Your password has expired.
>
> There are many more - pl see the authentication failure messages section 
> in the messages.properties. 
>
> Now - when you are giving the messages - all HTML Tags are supported. 
>
> Example -  This account has been locked ....BLA...BLA.....BLA . Visit -  
> <a href="http://www.abc.com";>Identity server self service</a> to take 
> corrective actions.  
>
> So - please customize the messages as per your requirements and your job 
> should be done. The above will possibly be the easiest method for 
> implementation of your use cases.
>
> Best Regards
>
> Ritesh Tripathi
>
> On Fri, Jan 1, 2021 at 11:46 AM Chun-Yao Wang <[email protected]> 
> wrote:
>
>> Dear Ritesh Tripathi:
>>
>>      I’m very grateful for your speedy reply, this is the best New Year 
>> gift I have got!!
>>      Before I read you post, it never came to my mind that the password 
>> policy can be set in LDAP.
>>      I am using the CAS6.0+OpenLdap on Ubuntu server, I will try your 
>> suggestion and test it.
>>      
>>      Could you allow me to ask some more question?
>>
>>    1. Can CAS show a "Account Locked due to too much attempt" message to 
>>    user when the user's account was lock?
>>    2. Can I redirect the user to my specific url when the user password 
>>    is expired?
>>
>>      Thank you so much for your reply!
>>      Best Regards & Best Wishes for New Year 2021!
>>
>>      Sincerely
>>      Chunyao Wang.
>> Ritesh Tripathi 在 2020年12月31日 星期四下午11:55:31 [UTC+8] 的信中寫道:
>>
>>> Dear Chun-Yao,
>>>
>>> Apache DS is LDAP Server. In all LDAP Server - including the 
>>> implementation of LDAP by Microsoft - which is called Active Directory - 
>>> have the feature of Password Policies. [Pl see - 
>>> https://ldapwiki.com/wiki/Password%20Policy]
>>>
>>> Apache DS also offers the password policy ;complying to the Draft 
>>> Specifications of Password Policy - 
>>> https://ldapwiki.com/wiki/Draft-behera-ldap-password-policy
>>>
>>> These can be easily configured in the Directory Studio Admin - by 
>>> opening the configuration file - going to Password Policies Tab. Pl see the 
>>> screenshot enclosed below [red indicates the parameters in your case to be 
>>> added to the system].
>>>
>>> [image: image.png]
>>>
>>> The CAS properties that i used for getting the application up and 
>>> running are given below. [version 6.2.x for CAS].
>>>
>>> #########local LDAP Connection String for authentication using the 
>>> Managers Bind Tested as OK on localhost.#################
>>> cas.authn.ldap[0].ldapUrl=ldap://localhost:389/
>>> cas.authn.ldap[0].bindDn=uid=admin,ou=system
>>> cas.authn.ldap[0].bindCredential=xxxx
>>>
>>> cas.authn.ldap[0].poolPassivator=BIND
>>> #cas.authn.ldap[0].connectionStrategy=DEFAULT
>>>
>>> #cas.authn.ldap[0].providerClass=org.ldaptive.provider.unboundid.UnboundIDProvider
>>> cas.authn.ldap[0].type=AUTHENTICATED
>>> #cas.authn.ldap[0].useSsl=false
>>> cas.authn.ldap[0].useStartTls=false
>>> cas.authn.ldap[0].baseDn=dc=tbitslocal,dc=com
>>> cas.authn.ldap[0].subtreeSearch=true
>>> cas.authn.ldap[0].searchFilter=(&(objectClass=person)(uid={user}))
>>>
>>> cas.authn.ldap[0].principalAttributeList=sn,cn:commonName,displayName,l,o,postalAddress,mail,mobile,ou
>>> cas.authn.ldap[0].minPoolSize=3
>>> cas.authn.ldap[0].maxPoolSize=10
>>> cas.authn.ldap[0].blockWaitTime=PT3S
>>> #cas.authn.ldap[0].useSsl=false
>>> cas.authn.ldap[0].useStartTls=false
>>> cas.authn.ldap[0].responseTimeout=PT5S
>>> cas.authn.ldap[0].allowMultipleDns=false
>>> cas.authn.ldap[0].allowMultipleEntries=false
>>> cas.authn.ldap[0].followReferrals=false
>>> cas.authn.ldap[0].name=localhostLDAP
>>>
>>> #################LDAP Password Policy##############################
>>> cas.authn.ldap[0].passwordPolicy.type=GENERIC
>>> cas.authn.ldap[0].passwordPolicy.enabled=true
>>>
>>> cas.authn.ldap[0].passwordPolicy.policyAttributes.accountLocked=javax.security.auth.login.AccountLockedException
>>> cas.authn.ldap[0].passwordPolicy.loginFailures=5
>>> #cas.authn.ldap[0].passwordPolicy.warningAttributeValue=
>>> #cas.authn.ldap[0].passwordPolicy.warningAttributeName=
>>> cas.authn.ldap[0].passwordPolicy.displayWarningOnMatch=true
>>> cas.authn.ldap[0].passwordPolicy.warnAll=true
>>> cas.authn.ldap[0].passwordPolicy.warningDays=1
>>> cas.authn.ldap[0].passwordPolicy.accountStateHandlingEnabled=true
>>>
>>>
>>> #############Properties for LDAP Password Management############
>>> cas.authn.pm.ldap[0].type=GENERIC
>>> cas.authn.pm.ldap[0].username-attribute=uid
>>> cas.authn.pm.ldap[0].ldapUrl=ldap://localhost:389/
>>> cas.authn.pm.ldap[0].bindDn=uid=admin,ou=system
>>> cas.authn.pm.ldap[0].bindCredential=xxxx
>>> cas.authn.pm.ldap[0].poolPassivator=BIND
>>> cas.authn.pm.ldap[0].connectionStrategy=RANDOM
>>> cas.authn.pm.ldap[0].connect-timeout=PT5S
>>>
>>> #cas.authn.pm.ldap[0].providerClass=org.ldaptive.provider.unboundid.UnboundIDProvider
>>> #cas.authn.pm.ldap[0].type=AUTHENTICATED
>>> #cas.authn.pm.ldap[0].useSsl=false
>>> cas.authn.pm.ldap[0].useStartTls=false
>>> cas.authn.pm.ldap[0].baseDn=dc=tbitslocal,dc=com
>>> cas.authn.pm.ldap[0].subtreeSearch=true
>>> cas.authn.pm.ldap[0].searchFilter=(&(objectClass=person)(uid={user}))
>>>
>>> #cas.authn.pm.ldap[0].principalAttributeList=sn,cn:commonName,displayName,l,o,postalAddress,mail,mobile
>>> cas.authn.pm.ldap[0].minPoolSize=3
>>> cas.authn.pm.ldap[0].maxPoolSize=10
>>> cas.authn.pm.ldap[0].blockWaitTime=PT3S
>>> #cas.authn.pm.ldap[0].useSsl=false
>>> cas.authn.pm.ldap[0].useStartTls=false
>>> cas.authn.pm.ldap[0].responseTimeout=PT5S
>>> cas.authn.pm.ldap[0].allowMultipleDns=false
>>> cas.authn.pm.ldap[0].allowMultipleEntries=false
>>> cas.authn.pm.ldap[0].followReferrals=false
>>> cas.authn.pm.ldap[0].name=localhostLDAP_PM_Feature
>>>
>>> #######################
>>> Some words of advice - to save time
>>>
>>> 1. While dealing with LDAP - pl test all your settings using the 
>>> commandline first before using them for configuration in CAS. Execute the 
>>> basic commands etc  "ldapsearch" using your settings - first using the 
>>> command line to ensure that your connections and values are working - 
>>> before filling in the CAS properties as applicable in your case. 
>>> 2. Pll don't blindly copy paste cas properties - think and understand 
>>> what you are doing. 
>>> 3. The only constraint that faced was that at the time of :"forget 
>>> username" or "forget password" - there can be only be a single search query 
>>> that can be defined - if you integrate with LDAP as against JDBC, where you 
>>> can define 2 different queries - one for getting usename and another for 
>>> fetching the email address etc. I overcame the above constraint - but 
>>> setting the username = email , for my use case. 
>>> 4. Before implementing a Directory Services as LDAP / ApacheDS - think 
>>> if you already have access to your LDAP or any other directory services 
>>> internally. All Standard Directory Services will offer you Password 
>>> Policies Features, better use them before introducing a new software in 
>>> your organization. 
>>>
>>> Please feel free to contact me - if you have any further questions. 
>>>
>>> Best Regards & Best Wishes for New Year 2021!
>>>
>>> Ritesh Tripathi
>>>
>>> On Thu, Dec 31, 2020 at 8:18 PM Chun-Yao Wang <[email protected]> 
>>> wrote:
>>>
>>>> Dear Ritesh Tripathi:
>>>>
>>>>     I have the same requirement with you.
>>>>     I  neet to  *"Lock user account for 30min after 3 unsuccessful 
>>>> login attempts"*
>>>>     Could you give me more detail about how to configure ApereoCAS + 
>>>> ApacheDS to achieve the requirements
>>>> ?
>>>>     Great Thanks!!
>>>>
>>>> Ritesh Tripathi 在 2020年11月19日 星期四上午12:45:13 [UTC+8] 的信中寫道:
>>>>
>>>>> Updating this thread so that this may be useful to others:
>>>>>
>>>>> A. Started Using ApacheDS - https://directory.apache.org/apacheds/ as 
>>>>> LDAP Server on windows machine. 
>>>>> B. Delegated all the password policy constraints to ApacheDS. The 
>>>>> apache DS can be administered via Apache Directory Studio and didn't do 
>>>>> any 
>>>>> implementation of custom code for implementing the same thing in JDBC.
>>>>> C. CAS worked wonderfully with LDAP authentication - including 
>>>>> password update in LDAP at the time of password expiry etc. 
>>>>>
>>>>> Thank you
>>>>>
>>>>> On Monday, 21 September 2020 at 19:57:25 UTC+5:30 [email protected] wrote:
>>>>>
>>>>>> I believe that the JDBC password policy settings are in the database 
>>>>>> authentication settings:
>>>>>>
>>>>>>  
>>>>>>
>>>>>>
>>>>>> https://apereo.github.io/cas/6.2.x/configuration/Configuration-Properties.html#database-authentication
>>>>>>
>>>>>>  
>>>>>>
>>>>>> Specifically          
>>>>>>
>>>>>>  
>>>>>>
>>>>>> # cas.authn.jdbc.query[0].field-expired=
>>>>>>
>>>>>> # cas.authn.jdbc.query[0].field-disabled=
>>>>>>
>>>>>>  
>>>>>>
>>>>>> Where both queries determine if an account is expired or disabled.
>>>>>>
>>>>>>  
>>>>>>
>>>>>> I am not certain, but I think you need a separate system, other than 
>>>>>> CAS, to expire and disable accounts in JDBC.
>>>>>>
>>>>>>  
>>>>>>
>>>>>>  
>>>>>>
>>>>>> *From:* [email protected] <[email protected]> *On Behalf Of *Ritesh 
>>>>>> Tripathi
>>>>>> *Sent:* Sunday, September 20, 2020 12:50 PM
>>>>>> *To:* CAS Community <[email protected]>
>>>>>> *Subject:* [cas-user] Cas 6.2 - Implmentation of Custom Password 
>>>>>> Policy for JDBC Authentication
>>>>>>
>>>>>>  
>>>>>>
>>>>>> Hello All,
>>>>>>
>>>>>>  
>>>>>>
>>>>>> We have a requirement that *"after 5 unsuccessful login attempts - 
>>>>>> we need to lock the account for a day for the said user."*
>>>>>>
>>>>>>  
>>>>>>
>>>>>> We are having a JDBC Authentication. 
>>>>>>
>>>>>>  
>>>>>>
>>>>>> We were just curious if anyone has implemented custom password policy 
>>>>>> using groovy scripts or some other method for requirements as above. 
>>>>>>
>>>>>>  
>>>>>>
>>>>>> The CAS documentation - seems to be specific for LDAP and other 
>>>>>> cases. Was not able to get more information on JDBC. 
>>>>>>
>>>>>>  
>>>>>>
>>>>>>
>>>>>> https://apereo.github.io/cas/6.2.x/configuration/Configuration-Properties-Common.html#password-policy-settings
>>>>>>
>>>>>>  
>>>>>>
>>>>>> Will the groovy script method as given in above documentation link 
>>>>>> work for JDBC as well ? Any comments or points to implement the above 
>>>>>> type 
>>>>>> and similar requirements. 
>>>>>>
>>>>>>  
>>>>>>
>>>>>> Best Regards
>>>>>>
>>>>>> R
>>>>>>
>>>>>> -- 
>>>>>> - Website: https://apereo.github.io/cas
>>>>>> - Gitter Chatroom: https://gitter.im/apereo/cas
>>>>>> - List Guidelines: https://goo.gl/1VRrw7
>>>>>> - Contributions: https://goo.gl/mh7qDG
>>>>>> --- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "CAS Community" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/a/apereo.org/d/msgid/cas-user/33d653bb-392c-457e-9d4b-b86785e2b26cn%40apereo.org
>>>>>>  
>>>>>> <https://groups.google.com/a/apereo.org/d/msgid/cas-user/33d653bb-392c-457e-9d4b-b86785e2b26cn%40apereo.org?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>
>>>
>>>
>

-- 
- Website: https://apereo.github.io/cas
- Gitter Chatroom: https://gitter.im/apereo/cas
- List Guidelines: https://goo.gl/1VRrw7
- Contributions: https://goo.gl/mh7qDG
--- 
You received this message because you are subscribed to the Google Groups "CAS 
Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/a/apereo.org/d/msgid/cas-user/8a7250ba-042d-4890-85b9-1a4bda5b0f50n%40apereo.org.

Reply via email to