Единый вход (SSO): как использовать Active Directory в качестве метода проверки подлинности для службы CAS?

Я разрабатываю портал для Liferay и хочу применить там механизм Single Sign On (SSO). Я использую Jasig CAS для централизованной аутентификации моих многочисленных веб-приложений. До сих пор я знаю, что я могу использовать CAS в качестве метода проверки подлинности, но следующим шагом было бы добавить дополнительные сведения и спросить аутентификацию с сервера Active Directory.

Это должно быть возможно, используя AD как "базу данных", к которой выполняется аутентификация, но я новичок в этих вещах и не знаю, как это сделать с Jasig CAS.

Как определить, как выполнить эту задачу?

Ответ 1

Я делаю несколько предположений здесь, поэтому, пожалуйста, дайте мне знать, если я не в теме:

  • Вы используете версию CAS между 3.3.2 и 3.4.8.
  • Вы хотите связать CAS в Active Directory с помощью LDAP (для Kerberos или SPNEGO см. ссылки ниже) с помощью Bind LDAP Handler (для FastBind см. ссылки ниже).
  • Вы знакомы с созданием CAS из источника через Maven.

Предпосылка

  • Если вы собираетесь связываться с AD через "ldaps://" (в отличие от "ldap://" ), JVM на вашем сервере CAS должен доверять SSL-сертификату вашего сервера Active Directory. Если вы используете самозаверяющий сертификат для AD, вам нужно импортировать его в хранилище доверия JVM.

Резюме

В вашем исходном дереве CAS вам необходимо внести изменения в следующие файлы:

  • саз-сервер WebApp/pom.xml
  • КАС-сервера веб-приложение/SRC/Главный/WebApp/WEB-INF/deployerConfigContext.xml

Подробнее

pom.xml:

Добавьте в <dependencies> следующее:

<!-- LDAP support -->
<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>cas-server-support-ldap</artifactId>
    <version>${project.version}</version>
</dependency>

deployerConfigContext.xml:

  • Переконфигурируйте ваши помощники аутентификации:

    • Ищите: <property name="authenticationHandlers">. Внутри это <list>, и внутри это (возможно) два элемента <bean ...>
    • Сохраните это:

      <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" />
      
    • Другой <bean> (опять же, вероятно) соответствует текущему методу аутентификации, который вы используете. (Я не понимаю на этот вопрос, так как существует несколько способов CAS может сделать это без использования внешних сервисов. По умолчанию используется SimpleTestUsernamePasswordAuthenticationHandler, это аутентифицируется, если имя пользователя равно паролю). Замените это <bean> на:

      <!-- LDAP bind Authentication Handler -->
      <bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">
      <property name="filter" value="uid=%u" />
          <property name="searchBase" value="{your LDAP search path, e.g.: cn=users,dc=example,dc=com}" />
          <property name="contextSource" ref="LDAPcontextSource" />
          <property name="ignorePartialResultException" value="yes" /> <!-- fix because of how AD returns results -->
      </bean>
      
    • Измените свойство "searchBase" в соответствии с конфигурацией AD.

  • Создайте источник контекста для LDAP:

    • Добавьте это где-нибудь внутри корневого элемента <beans>:

      <bean id="LDAPcontextSource" class="org.springframework.ldap.core.support.LdapContextSource">
          <property name="pooled" value="false"/>
          <property name="urls">
              <list>
                  <value>{URL of your AD server, e.g.: ldaps://ad.example.com}/</value>
              </list>
          </property>
          <property name="userDn" value="{your account that has permission to bind to AD, e.g.: uid=someuser, dc=example, dc=com}"/>
          <property name="password" value="{your password for bind}"/>
          <property name="baseEnvironmentProperties">
              <map>
                  <entry>
                      <key>
                          <value>java.naming.security.authentication</value>
                      </key>
                      <value>simple</value>
                  </entry>
              </map>
          </property>
      </bean>
      
    • Измените "urls", "userDn" и "password" соответственно.

Восстановите cas-server-webapp и попробуйте.

Литература: