所以在在不改域控制器的前提下,我只好尝试了用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/[email protected] /pass * /mapuser [email protected] /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="NTLMallowed" value="true"/> </bean>
并注释掉原来的
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
☆在bean同级的位置加入以下内容:
<bean name="jcifsConfig" class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSConfig"> <property name="jcifsServicePrincipal" value="HTTP/[email protected]" /> <property name="kerberosDebug" value="false" /> <property name="kerberosRealm" value="YOUR.REALM.HERE" /> <property name="kerberosKdc" value="THE.KDC.IP.HERE" /> <property name="loginConf" value="/path/to/WEB-INF/login.conf" /> </bean>
注意:your.server.name.here要写全名 name.domain name。
☆/path/to/WEB-INF/下创建login.conf文件,内容如下:
jcifs.spnego.initiate { com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="/home/cas/kerberos/myspnaccount.keytab"; }; jcifs.spnego.accept { com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="/home/cas/kerberos/myspnaccount.keytab"; };
注意:keyTab要写清楚keytab文件所在的路径。
至此AD与CAS服务器的配置就完成了。但是现在仍然不可用,需要在客户机做一些配置(cas的配置这里就不说了,默认为cas配置成功的,应用系统已经接入,要从客户机访问应用系统)。
客户机配置:
☆打开浏览器,找到Internet选项中的安全——本地Internet——站点——高级——,将CAS服务器的完整域名加入到信任站点。如:https://cas.domain name。
☆Internet选项中的高级,勾选中“集成身份验证(windows)”。
到这里为止,cas与ad域的集成就可用了,其他优化可以自行配置。祝顺利。