zoukankan      html  css  js  c++  java
  • CAS中配置Spnego协议支持

    写在前面的话

      公司原有的认证系统,是基于CAS4.1.8,并已经可以工作,此次的要求是实现支持Spnego,期间绕了很大的圈,主要原因还是对AD域的不熟悉。

      在开发时要有三台机器,分别是Windows Server(提供DNS服务和AD域服务),Client(即客户机),Web Application Server(部署CAS应用的服务器,一般为linux系统,这里我以windows系统为例)

    环境:

      windows server 2012 r2,JDK1.8,win7(client和web application server) 

    具体步骤:

    1.Windows Server 创建DNS服务器

      具体参照:http://jingyan.baidu.com/article/e9fb46e17822727520f76652.html

    2.Windows Server 创建AD域服务

      参照:http://www.cnblogs.com/wanggege/p/4605678.html,假设添加的域为:example.com

    3.添加域用户

      这里假设客户机用户名为client,应用服务器用户名为server。

      开始->Active Directory 用户和计算机->Users->新建->用户,设置账户密码永不过期。

      添加用户后,要修改用户账户选项:选中要修改用户右键->属性->账户,在账户选项中,只勾选“该账户支持 Kerberos AES 256位加密”,重置用户密码。

    4.将两台机器加入AD域中

      参照:http://jingyan.baidu.com/article/358570f67d81b2ce4724fcfe.html

    5.创建SPN账户

      在windows server上,运行cmd.exe,输入命令 setspn -s HTTP/server.example.com@EXAMPLE.COM server,添加spn账户,输入命令 setspn -l server,检查添加是否成功。

    6.ktpass.exe导出keytab文件

      参照:https://technet.microsoft.com/en-us/library/cc753771.aspx,运行cmd.exe,输入命令举例:

      ktpass /princ HTTP/server.example.com@EXAMPLE.COM /mapuser server /pass ****** /out server.keytab /crypto all /ptype KRB5_NT_PRINCIPAL /mapop set

      生成的keytab文件,在cmd进入目录下,复制server.keytab文件,粘贴到WEB Application server上,记住文件目录。

    7.配置浏览器

      IE:Internet选项->高级,勾选“启用集成 Windows 验证”;Internet选项->安全->本地Intranet->站点->高级,添加 http://server.example.com,保存

      Firefox:在地址栏上输入“about:config”,进入配置页面,搜索“negotiate”,为“network.negotiate-auth.trusted-uris”为 http://server.example.com

    8.Java密码扩展 

      Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件。官方网站提供了JCE无限制权限策略文件的下载:
      JDK7下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
      JDK8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

      相关配置文档:http://www.javamex.com/tutorials/cryptography/unrestricted_policy_files.shtml

    9.配置CAS组件

      可参照:https://apereo.github.io/cas/4.2.x/installation/SPNEGO-Authentication.html

      login-webflow.xml中, viewLoginForm state前,定义两个新的action state 

    <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>

      找到generateLoginTicket action,替换 viewLoginForm startAuthenticate

      定义两个 bean 在 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"
          p:centralAuthenticationService-ref="centralAuthenticationService" />

      

      用以下模板更新deployerConfigContext.xml 

      

    <bean id="jcifsConfig"
          class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSConfig"
          p:jcifsServicePrincipal="HTTP/server.example.com@EXAMPLE.COM"
          p:kerberosDebug="false"
          p:kerberosRealm="EXAMPLE.COM"
          p:kerberosKdc="172.10.1.10"
          p:loginConf="/login.conf" />
    
    <bean id="spnegoAuthentication" class="jcifs.spnego.Authentication" />
    
    <bean id="spnegoHandler"
          class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler"
          p:authentication-ref="spnegoAuthentication"
          p:principalWithDomainName="false"
          p:NTLMallowed="true" />
    
    <bean id="spnegoPrincipalResolver"
          class="org.jasig.cas.support.spnego.authentication.principal.SpnegoPrincipalResolver" />
    
    <bean id="authenticationManager"
          class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
      <constructor-arg>
        <map>
          <entry key-ref="spnegoHandler" value-ref="spnegoPrincipalResolver"/>
        </map>
      </constructor-arg>
      <property name="authenticationMetaDataPopulators">
        <list>
          <bean class="org.jasig.cas.authentication.SuccessfulHandlerMetaDataPopulator" />
        </list>
      </property>
    </bean>

      提供login.conf 文件,这里我把文件放到了类路径下

    jcifs.spnego.initiate {
       com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="C:/Users/server/server.keytab";
    };
    jcifs.spnego.accept {
       com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="C:/Users/server/server.keytab";
    };

    10.修改客户机hosts文件

      添加 

    172.10.1.10 server.example.com

    11.若有需要,修改web.xml

      修改属性casServerLoginUrl和serverName,更改其中的ip为server.psso.com

     

  • 相关阅读:
    libevent学习总结
    C#结构体的使用
    函数常用类
    C#函数的基础应用
    数组的应用:冒泡排序,折半查找及二维数组的应用
    作业
    复习break、continue、while、do-while的运用
    编程常用英语单词
    作业:for循环,迭代法和穷举法
    循环语句
  • 原文地址:https://www.cnblogs.com/lzw-st/p/6156119.html
Copyright © 2011-2022 走看看