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" />
各属性说明如下:
序号 | 属性名 | 说明 | 是否必须 |
---|---|---|---|
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下。
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/phpcas2) 自行管理程序集,把 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);//根据指定模块打开新标签 }
相关文章推荐
- 单点登录系统cas资料汇总
- 单点登录系统cas资料汇总
- 单点登录系统cas资料汇总
- php实现的SSO单点登录系统接入功能示例分析
- 各大系统如何接入统一的登录认证
- 一元云购系统接入短信功能问题汇总
- ubuntu账户密码正确但是登录不进去系统
- 系统登录界面的验证码
- 【shell编程】分发系统介绍、expect脚本远程登录、expect脚本远程执行命令和expect脚本传递参数
- linux基础(一)------登录以及文件系统的了解
- Windows 7 系统里防止登录密码丢失的方法
- Debian 8.0桌面系统root用户登录和root用户自动登录
- 多用户管理系统--登录(1)
- 有关linux系统登录出现启动会话失败
- Yii2框架博客系统登录注册
- oracle ebs系统维护技巧汇总(转载)
- mac系统使用技巧链接汇总
- Ubuntu系统下使用技巧汇总(持续更新中~)
- 系统调用,上下文切换及中断概念的汇总
- linux系统查看硬件以及系统信息常用命令汇总