日期:2014-05-16  浏览次数:20593 次

实现CAS与AD在Linux下集成(修订)
        前段时间对CAS的单点登录方案与AD域在Windows下的集成做了总结,但是由于该方案需要修改AD域中的加密类型,在企业中的域上使用便完全不通了。因为用作生产环境的域会有多台控制器相互复制,而复制过程需要加密,修改加密类型以后,会导致域控制器间无法复制,造成域的瘫痪。

        所以在在不改域控制器的前提下,我只好尝试了用Linux搭建CAS服务器,如果路过朋友有在Windows下配置成功的经验,希望分享。

        下面备忘一下我在Linux下的配置,参考文档就是CAS提供的标准文档,几乎没有改动,此处翻译过来供自己备忘,供大家参考。
        链接:https://wiki.jasig.org/display/CASUM/SPNEGO

        首先准备好最新版的CAS Server 与 Client 我使用的是3.4.11 Server 和 3.2.1 Client。
        另外客户机、应用系统服务器,都要加入域,域用户要创建好。
        然后所使用的Linux系统是R5,在上面装好JDK和Tomcat,JDK用最新版本吧,可以免去很多问题。

        现在就开始配置了,首先完成AD域中所要做的工作:

                ☆生成一个Keytab文件。
        用命令:
ktpass.exe /out myspnaccount.keytab /princ HTTP/your.server.name.here@YOUR.REALM.HERE /pass * /mapuser
myspnaccount@YOUR.REALM.HERE /ptype KRB5_NT_PRINCIPAL /crypto RC4-HMAC-NT /kvno 0

        这里注意,your.server.name.here最好使用完整名,即name.domain name。
        还要注意 在后边加 /kvno 0 这样的参数 将生成的keytab文件变为0号版本(第一次生成的版本为3),这可能是cas的一个bug。
        生成好Keytab文件后,将文件拷到CAS服务器中。

        接下来要做CAS服务器中的配置:

                ☆在 /WEB-INF/login-webflow.xml文件中加入以下两段,要放在State “viewLoginForm”之前:
<action-state id="startAuthenticate">
  <evaluate expression="negociateSpnego" />
  <transition on="success" to="spnego" />
</action-state>
 
<action-state id="spnego">
  <evaluate expression="spnego" />
  <transition on="success" to="sendTicketGrantingTicket" />
  <transition on="error" to="viewLoginForm" />
</action-state>


                ☆将/WEB-INF/login-webflow.xml中的下面两个地方修改(与标准文档不同):
        decision-state gatewayRequestCheck中的generateLoginTicket 改为 startAuthenticate
        decision-state renewRequestCheck 中的generateLoginTicket 改为 startAuthenticate

                ☆/WEB-INF/cas-servlet.xml文件中加入以下内容:
<bean id="negociateSpnego" class="org.jasig.cas.support.spnego.web.flow.SpnegoNegociateCredentialsAction" />
 
<bean id="spnego" class="org.jasig.cas.support.spnego.web.flow.SpnegoCredentialsAction">
    <property name="centralAuthenticationService" ref="centralAuthenticationService"/>
</bean>


                ☆/WEB-INF/deployerConfigContext.xm文件中做以下修改:
        在credentialsToPrincipalResolvers下的list中加入
<bean class="org.jasig.cas.support.spnego.authentication.principal.SpnegoCredentialsToPrincipalResolver" />

        在authenticationHandlers下的list中加入
<bean class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler">
    <property name="authentication">
      <bean class="jcifs.spnego.Authentication" />
    </property>
    <property name="principalWithDomainName" value="false" />
    <property name="NTLMallo