您的位置:首页 > 其它

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

2018-03-22 10:27 1141 查看

第 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" />


各属性说明如下:

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

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

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()方法获取

第 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系统的操作说明,大致与第三章相似,本章作为扩展补充;

一.大概流程如下:

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

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

最后重点写登录这里的调用和判断,一定要开启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();//获取登录人信息   例如:cnldap-sale1@cn.cnlink.net
//判断是否有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);//根据指定模块打开新标签
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: