Единый вход (SSO): как использовать Active Directory в качестве метода аутентификации для службы CAS? - PullRequest
12 голосов
/ 20 июня 2011

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

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

1 Ответ

28 голосов
/ 22 июня 2011

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

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

Предпосылка

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

Резюме

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

  • КАС-сервер WebApp / pom.xml

Подробнее

pom.xml:

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

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

deployerConfigContext.xml:

  1. Переконфигурируйте ваши держатели аутентификации:

    • Ищите: <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.

  2. Создание источника контекста для 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 и попробуйте.

Ссылки

...