.NET应用程序通过修改web.config文件。主要改造内容如下:
- 程序集部署
- 添加casClientConfig 配置节
- 修改ASP.NET forms 验证
- 注册 CasAuthenticationModule
1) 将 如下 DotNetCasClient.dll文件直接部署到应用的/Bin目录中或者放到Global Assembly中
2) 配置CasAuthenticationModule
<configSections>
<section name="casClientConfig" type="DotNetCasClient.Configuration.CasClientConfiguration,DotNetCasClient"/>
configSections>
将 配置元素直接放在根目录 节点下. casClientConfig内容如下
ClientConfig
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未启用的跳转地址 | 可选 |
在
<system.web>
<httpModules>
<add name="DotNetCasClient"
type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>
httpModules>
system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="DotNetCasClient"/>
<add name="DotNetCasClient"
type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>
modules>
system.webServer>
<system.web>
<authentication mode="Forms">
<forms
loginUrl=" https://casService/login "
timeout="30"
defaultUrl="~/Default.aspx"
cookieless="UseCookies"
slidingExpiration="true"
path="/ApplicationName/" />
authentication>
system.web>
如果发现有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">
java应用程序通过将客户端相应的jar文件部署到lib中,并修改web.xml文件,修改内容如下:
如果为maven项目 添加对应的依赖内容:
<dependency>
<groupId>org.jasig.cas.clientgroupId>
<artifactId>cas-client-coreartifactId>
<version>3.1.12version>
dependency>
如果为非maven项目,将对应的jar文件拷贝到WEB-INF/lib下。
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class>
listener>
<filter>
<filter-name>CAS Single Sign Out Filterfilter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>CASFilterfilter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>
<init-param>
<param-name>casServerLoginUrlparam-name>
<param-value>https://casService/loginparam-value>
init-param>
<init-param>
<param-name>serverNameparam-name>
<param-value>http://appnameparam-value> 注:此项配置应用的地址
init-param>
filter>
<filter-mapping>
<filter-name>CASFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>CAS Validation Filterfilter-name>
<filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
filter-class>
<init-param>
<param-name>casServerUrlPrefixparam-name>
<param-value>https://casServiceparam-value>
init-param>
<init-param>
<param-name>serverNameparam-name>
<param-value>http://appNameparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CAS Validation Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>CAS Assertion Thread Local Filterfilter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
通过HttpServletRequest的getRemoteUser()方法获取
php应用程序通过修改相应的config文件,再将程序集部署到lib中,修改内容如下:
- 程序集部署
- 添加 phpcas config
- 初始化 phpcas
composer require jasig/phpcas
参照页面:
https://wiki.jasig.org/display/CASC/phpCAS+installation+guide
https://packagist.org/packages/jasig/phpcas
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');
phpCAS::client(CAS_VERSION_2_0, CNLINK_CAS_HOST, CNLINK_CAS_PORT, CNLINK_CAS_CONTEXT);
调整CAS配置,把成功的IITP登入请求重定向到IITP的页面:
https://order.cnlinkchina.com/ucenter/index.php
/src/portal/bin/cCNLink.Auth.class.php
/src/portal/bin/CAS.php
/src/portal/config.php
IITP 在对登入以外的用户操作例如创建丶更新帐号或修改用户密码时,会以 LDAPS 协定直接进行操作。
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
/src-api/lib/UserServiceHelper.php
Thinkphp应用程序主要针对BOSS系统链接CAS系统的操作说明,大致与第三章相似,本章作为扩展补充;
先到CAS系统登录进去创建一个BOSS应用,路径指到首页即可,反正任何页面都会判断是否登录,如果没有登录,就调用登录方法,将BOSS跳转到CAS登录的方法放到登录这里是最合适的。
然后下载phpcas扩展包,保存到thinkphp的第三方文件下。
最后重点写登录这里的调用和判断,一定要开启boss系统的IP访问许可,因为BOSS远程到CAS服务器验证登录状态后,CAS会通过URL传ticket给BOSS,这里用的是IP访问BOSS。
/core/Library/Vendor/phpCAS/CAS
/app/Common/Conf/config.php
/app/Index/Controller/IndexController.class.php
/themes/default/Index/Index/index.php
此路径为新创建的目录下存放下载的最新phpcas包,没有更改,直接调用
下载路径为:
https://developer.jasig.org/cas-clients/php/current/
官方手册(全英文,满级请进):
https://developer.jasig.org/cas-clients/php/current/docs/api/classphpCAS.html
里面新增了几个常量的配置:
'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即可。
别慌,三十行代码搞定。
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 = ;//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