Cas websso单点登录系统接入汇总

第 1 章 .net 应用程序

.NET应用程序通过修改web.config文件。主要改造内容如下:
- 程序集部署
- 添加casClientConfig 配置节
- 修改ASP.NET forms 验证
- 注册 CasAuthenticationModule

1. 程序集部署

1) 将 如下 DotNetCasClient.dll文件直接部署到应用的/Bin目录中或者放到Global Assembly中

2) 配置CasAuthenticationModule

2. 添加 casClientConfig 配置节点

<configSections>
 <section name="casClientConfig" type="DotNetCasClient.Configuration.CasClientConfiguration,DotNetCasClient"/>
</configSections>

将 配置元素直接放在根目录 节点下. casClientConfig内容如下

<casClientConfig
  casServerLoginUrl="https://casService/login"  注:此项为cas service服务端登录地址
  casServerUrlPrefix="https://casService/" 注:此项为cas service服务端地址
  serverName="https://appName"  注:此项配置应用的地址
  notAuthorizedUrl="~/NotAuthorized.aspx"
  cookiesRequiredUrl="~/CookiesRequired.aspx"
  redirectAfterValidation="true"
  renew="false"
  singleSignOut="true"
  ticketValidatorName="Cas20"
  serviceTicketManager="CacheServiceTicketManager" />

各属性说明如下:

序号 属性名 说明 是否必须
1 casServerLoginUrl Cas Server的登录地址 必须
2 serverName 客户端应用的名称 必须
3 casServerUrlPrefix CAS server应用的根地址 必须
4 ticketValidatorName 应用票据验证的协议名,可选有Cas10, Cas20, and Saml11 必须
5 gateway 网关地址 可选
6 renew 是否强制应用重新认证,默认值为false 可选
7 singleSignOut 允许CAS SERVER 发送退出消息来销毁回话,默认为true 可选
8 notAuthorizedUrl 不需要认证的地址 可选
9 cookiesRequiredUrl Cookie未启用的跳转地址 可选

3. 注册CasAuthenticationModule

注册 httpModules 节点

<system.web>
  <!-- Other system.web elements here -->
  <httpModules>
    <add name="DotNetCasClient"
         type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>
    <!-- Other modules here -->
  </httpModules>
</system.web>

注册modules 节点

<system.webServer>
  <!--
   Disabled Integrated Mode configuration validation.
   This will allow a single deployment to  run on IIS 5/6 and 7+
   without errors
  -->
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  <!--
   Remove and Add the CasAuthenticationModule into the IIS7+
   Integrated Pipeline.  This has no effect on IIS5/6.
  -->
  <remove name="DotNetCasClient"/>
  <add name="DotNetCasClient"
       type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>
  <!-- Other modules here -->
  </modules>
</system.webServer>

4. 配置 ASP.NET Forms 认证配置 ASP.NET Forms 认证节点,

<system.web>
  <authentication mode="Forms">
    <forms
      loginUrl=" https://casService/login "
      timeout="30"
      defaultUrl="~/Default.aspx"
      cookieless="UseCookies"
      slidingExpiration="true"
      path="/ApplicationName/" />
  </authentication>
  <!-- Other system.web elements here -->
</system.web>

5. 常见错误

如果发现有A potentially dangerous Request.Form value was detected from the client ,增加配置:
在全局级别(Web.config中)设置

<configuration>
    <system.web>
        <pages  validateRequest="false">

但是,以上设置仅对ASP.NET2.0有效。在ASP.NET4.0版本上,我们需要更多一行的配置:
在全局级别(Web.config中)设置

<configuration>
    <system.web>
        <httpRuntime  requestValidationMode="2.0">

第 2 章 java 应用程序

java应用程序通过将客户端相应的jar文件部署到lib中,并修改web.xml文件,修改内容如下:

  • Jar文件部署

- Web.xml修改

1. Jar文件部署

如果为maven项目 添加对应的依赖内容:

<!-- cas -->
<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.1.12</version>
</dependency>

如果为非maven项目,将对应的jar文件拷贝到WEB-INF/lib下。

  1. Web.xml修改
<!-- ======================== 单点登录开始 ======================== -->
    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器负责用户的认证工作,必须启用它 -->
    <filter>
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://casService/login</param-value>
            <!--这里的server是服务端的地址 -->
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://appname</param-value> 注:此项配置应用的地址
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CASFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
    <filter-class>           org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://casService</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://appName</param-value>  
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>
            org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
    <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- ======================== 单点登录结束 ======================== -->

3. 获取用户信息

通过HttpServletRequest的getRemoteUser()方法获取

扫描二维码关注公众号,回复: 1594408 查看本文章

第 3 章 php 应用程序

php应用程序通过修改相应的config文件,再将程序集部署到lib中,修改内容如下:
- 程序集部署
- 添加 phpcas config
- 初始化 phpcas

1. 程序集部署

1) 如使用composer管理程序集

composer require jasig/phpcas

2) 自行管理程序集,把 phpcas 解压缩到php程序的目录下,例如/lib

参照页面:

https://wiki.jasig.org/display/CASC/phpCAS+installation+guide

https://packagist.org/packages/jasig/phpcas

2. 添加 phpcas config

include_once BASE_DIR . '/bin/CAS.php';
define('CNLINK_CAS_HOST', 'apiwebssouat.cnlink.net');
define('CNLINK_CAS_PORT', 443);
define('CNLINK_CAS_CONTEXT', '/cas2');
define('CNLINK_CAS_CACERT_PATH', '/path/to/cachain.pem');

3. 初始化 phpcas

phpCAS::client(CAS_VERSION_2_0, CNLINK_CAS_HOST, CNLINK_CAS_PORT, CNLINK_CAS_CONTEXT);

4. IITP整合配置

调整CAS配置,把成功的IITP登入请求重定向到IITP的页面:

https://order.cnlinkchina.com/ucenter/index.php

5. IITP 原代码和CAS相关的代码位置:

/src/portal/bin/cCNLink.Auth.class.php
/src/portal/bin/CAS.php
/src/portal/config.php

6. IITP 对 LDAP 的整合

IITP 在对登入以外的用户操作例如创建丶更新帐号或修改用户密码时,会以 LDAPS 协定直接进行操作。

5.1 使用的程式集

IITP 使用 adldap 来对 LDAP 服务器作出请求。
详细可以参照以下页面:
http://adldap.sourceforge.net/wiki/doku.php?id=api_user_functions
http://adldap.sourceforge.net/wiki/doku.php?id=api_group_functions

5.2 IITP 原代码和LDAP操作相关的代码位置:

/src-api/lib/UserServiceHelper.php

第四章thinkphp 应用程序

Thinkphp应用程序主要针对BOSS系统链接CAS系统的操作说明,大致与第三章相似,本章作为扩展补充;

一.大概流程如下:

  1. 先到CAS系统登录进去创建一个BOSS应用,路径指到首页即可,反正任何页面都会判断是否登录,如果没有登录,就调用登录方法,将BOSS跳转到CAS登录的方法放到登录这里是最合适的。

  2. 然后下载phpcas扩展包,保存到thinkphp的第三方文件下。

  3. 最后重点写登录这里的调用和判断,一定要开启boss系统的IP访问许可,因为BOSS远程到CAS服务器验证登录状态后,CAS会通过URL传ticket给BOSS,这里用的是IP访问BOSS。

二.以下为CAS代码涉及到的文件路径

/core/Library/Vendor/phpCAS/CAS   
/app/Common/Conf/config.php
/app/Index/Controller/IndexController.class.php
/themes/default/Index/Index/index.php

三.下面对这此配置CAS做详细步骤说明:

1.其中 /core/Library/Vendor/phpCAS/CAS

此路径为新创建的目录下存放下载的最新phpcas包,没有更改,直接调用
下载路径为:

https://developer.jasig.org/cas-clients/php/current/

官方手册(全英文,满级请进):

https://developer.jasig.org/cas-clients/php/current/docs/api/classphpCAS.html

2. /app/Common/Conf/config.php

里面新增了几个常量的配置:

'CNLINK_CAS_START' =>false,//开启 CAS验证
'CNLINK_CAS_HOST'  =>'uatiwebsso.cnlink.net',//CAS服务器域名
'CNLINK_CAS_PORT'  =>443,//CAS服务器 端口
'CNLINK_CAS_CONTEXT'   =>'',//给CAS服务器的URL里的内容 (一般不用,空着就行 )

端口一定要用数字型443 ,网络上的8443和80都不通,原因不明。

'CNLINK_CAS_START'  =>false,//开启 CAS验证

这个验证只是因为还没有正式上线CAS验证系统,等正式上了直接修改这里为TRUE即可。

3. 重点在 /app/Index/Controller/IndexController.class.php

别慌,三十行代码搞定。

if(C('CNLINK_CAS_START')){//为了不影响正常使用  cas调试阶段需要做判断
 $this -> CasLogin();//启动单点登录
}

在登录方法开始就做判断调用这个新方法。

if(C('CNLINK_CAS_START')){//为了不影响正常使用  cas调试阶段需要做判断
   $this -> CasLogin(true);//退出cas
}

同时在退出方法里也调用这个方法,只是传参不同,以此判断是登录还是退出。

新方法具体内容如下:

private function CasLogin($logout = false){
      require_once './core/Library/Vendor/phpCAS/CAS.php';
      $phpCAS = new \phpCAS();//实例化单点类
//    $phpCAS::setDebug("./casphp.log");//生成日志  可以看到验证过程
//    $phpCAS::setVerbose(true);//显示报错信息  开发使用  正式注释
      $phpCAS::client(CAS_VERSION_2_0,C('CNLINK_CAS_HOST'),C('CNLINK_CAS_PORT'),C('CNLINK_CAS_CONTEXT'));//指定单点服务器和端口
      $phpCAS::setNoCasServerValidation();//不使用SSL服务校验
      if(!$logout){
         if($phpCAS::checkAuthentication()){//成功登录  一定要开启IP访问boss系统 否则这里cas返回访问boss时用到的是IP
            $username=$phpCAS::getUser();//获取登录人信息   例如:[email protected]
            //判断是否有session登录信息  如果没有就创建  有就跳转
            $temp_arr = explode('@',$username);//登录人邮箱全称拆成数组
            $user_id = $temp_arr[0];//获取邮箱前缀
            if($_SESSION['USER_ID'] != $user_id){//cas登录的人不是当前boss的登录人  直接修改boss里session
               $user = D('System/User') -> getUserInfoAppoint("USER_ID = '".$user_id."'",'UID'); 
               if($user['UID']){
                  D('User') -> gosetUserStatus($user['UID'],123456);//直接修改boss里session BOSS不保存密码 默认123456即可
               }else{
                  show_msg2('用户不在BOSS系统里!',C('CNLINK_CAS_HOST'));
               }
            }
            $url_str = '/index/index/index';
            if($_GET['action']){//根据CAS传参 打开指定模块标签页
               $url_str .= '?action='.$_GET['action'];
            }
            redirect($url_str);//直接到指定页面
         }else{//没有登录
            $phpCAS::forceAuthentication();//跳转到单点服务的登录页
         }
      }else{//退出
         $phpCAS::logout();
      }
   }

看到开始的代码:

require_once './core/Library/Vendor/phpCAS/CAS.php';
$phpCAS = new \phpCAS();//实例化单点类

thinkphp对第三方类的加载当前这样比较稳妥易懂,导致调用方法和官方有所不同,敬请谅解。

到此,BOSS系统与CAS系统的登录和退出都正常了.

补充内容:

由于BOSS系统内容页都是addTags()方法增加的标签页,所以就需要CAS传action参数判断具体模块ID,再指派到页面通过js的方式打开新标签页这又涉及到首页的控制器和模板页两个文件。
/app/Index/Controller/IndexController.class.php
- if($_GET[‘action’]){//如果存在这个 应该是cas跳转过来指定打开某个菜单的 例如:/Crm/Demand/clist

$action_str_tmp = $this -> _menu ->getInfoByWhere("HREF = '".$_GET['action']."'" ,"MODULE_ID,MODULE_NAME,HREF");
   if($action_str_tmp){//将查询到的菜单名称和ID、路径做成json传到页面
      $action_str = json_encode($action_str_tmp);
   }
}

$this -> assign("action_str",$action_str);

/themes/default/Index/Index/index.php
var action_str = <!--{$action_str}-->;//cas指定跳转页面
if(action_str.MODULE_ID){
   addTags(action_str.MODULE_NAME,action_str.MODULE_ID,action_str.HREF);//根据指定模块打开新标签
}

版权声明:本文为博主原创文章,未经博主允许不得转载
转载请注明出处: https://blog.csdn.net/deng11408205/article/details/79650272

猜你喜欢

转载自blog.csdn.net/deng11408205/article/details/79650272