.NET应用和AEAI CAS集成详解

2016-12-31 08:21:20来源:cnblogs.com作者:数通畅联人点击

概述

数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过程步骤,为后续类似的统一认证配置实现提供参考指导。

预期读者

  • 数通畅联新员工

  • 广大技术爱好者

环境信息

操作系统:Windows Server 2008

第三方系统.NET Framework 版本:V4.0

名词解释

AEAI CAS:是数通畅联基于开源Jasig CAS扩展开发提供的统一认证平台,经过多年的实践和积累,通过提供统一的认证服务、授权服务、集中管理用户信息;AEAI CAS统一身份认证平台功能包括:账号同步模块及接口、单点登录客户端配置、账号密码管理功能。AEAI CAS的功能架构如下图:

 

.Net: .NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的,联通的,适应变化的,稳定的和高性能的。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序如果一个应用程序跟.NET Framework无关,它就不能叫做.NET程序。比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAP SDK调用一个Web Service也不是.NET应用。.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式

配置过程

5.1 添加动态链接库

在进行CAS认证配置前,需要先添加CAS 的客户端文件即相关的动态链接库.dll文件,放置于.NET应用的bin目录,如下图:

 

5.2 配置web.config

在修改web.config文件之前,先了解web.config文件中一些标签的含义。

5.2.1 web.config详解

Web.config 文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.Net Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。

  1. web.config是以XML文件规范存储,配置文件分为以下格式:

    1. configSections

      位于配置文件的顶部配置节处理程序声明;

    2. appSetting

      可以定义应用程序的全局常量设置等信息;

    3. system.Web

      控制Asp.net运行时的行为;

    4. sectionGroup

      可以自定义分组,可以放到<configSections>内部或其它<sectionGroup>标记的内部;

  2. 配置节的每一节

    1. <configuration>

根元素,其它节都是在它的内部.

    1. <appSetting>

此节用于定义应用程序设置项。对一些不确定设置,还可以让用户根据自己实际情况自己设置

例如:

I. 定义了一个连接字符串常量,并且在实际应用时可以修改连接字符串,不用修改程式代码.

<appSettings>

<add key="SystemCode" value="CM"/>

II. 定义了一个页面.

<appSettings>

<add key="KeepAlivePage" value="default.aspx?ping=y"/>

<appSettings>

    1. <compilation>

<compilation debug="true"  defaultLanguage="c#"  targetFramework="4.0" >

debug : true时,启动aspx调试;为false不启动aspx调试,因而可以提高应用程序运行时的性能。一般程序员在开发时设置为true,交给客户时设置为false.

default language: 定义后台代码语言,可以选择C#VB.net两种语言.

targetFrameworkVS2010识别的指令

    1. < customErrors >

<customErrors mode="Off"/>

mode : 具有On,Off,RemoteOnly 3种状态。On表示始终显示自定义的信息; Off表示始终显示详细的asp.net错误信息;  RemoteOnly表示只对不在本地Web服务器上运行的用户显示自定义信息.

    1. < globalization >

<globalization requestEncoding="UTF-8" responseEncoding="UTF-8" fileEncoding="utf-8" />

requestEncoding: 它用来检查每一个发来请求的编码.

responseEncoding: 用于检查发回的响应内容编码.

fileEncoding: 用于检查aspx,asax等文件解析的默认编码.

    1. < sessionState >

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="UseCookies" timeout="120" regenerateExpiredSessionId="true"/>

mode: 分为off,Inproc,StateServer,SqlServer几种状态

stateConnectionString :指定Asp.net应用程序存储远程会话状态的服务器名,默认为本机

cookieless: 设置为true时,表示不使用cookie会话状态来标识客户;否则,相反.

timeOut: 用来定义会话状态存储的时间,超过期限,将自动终止会话.

regenerateExpiredSessionId: 指定当客户端指定了过期的会话 ID 时是否重新发出会话 ID。默认情况下,当启用了 regenerateExpiredSessionId 时,仅为 cookieless 模式重新发出会话 ID

    1. < authentication >

<authentication mode="Forms">

<forms

loginUrl="http://localhost:8080/cas/login"

timeout="30"

defaultUrl="~/Main.aspx"

cookieless="UseCookies"

slidingExpiration="true" />

</authentication>

Ø Windows: 使用IIS验证方式

Ø Forms: 使用基于窗体的验证方式

Ø Passport: 采用Passport cookie验证模式

Ø None: 不采用任何验证方式

  1. 重点节点

    1. <authentication>

      作用:配置 ASP.NET 身份验证支持(为WindowsFormsPassPortNone四种)。该元素只能在计算机、站点或应用程序级别声明。< authentication> 元素必需与<authorization> 节配合使用。

      示例:以下示例为基于窗体(Forms)的身份验证配置站点,当没有登陆的用户访问需要身份验证的网页,网页自动跳转到登陆网页。

<authentication mode="Forms" >

<forms loginUrl="logon.aspx" name=".FormsAuthCookie"/>

</authentication>

其中元素loginUrl表示登陆网页的名称,name表示Cookie名称。

    1. <authorization>

      作用:控制对 URL 资源的客户端访问(如允许匿名用户访问)。此元素可以在任何级别(计算机、站点、应用程序、子目录或页)上声明。必需与<authentication> 节配合使用。

      示例:以下示例禁止匿名用户的访问

<authorization>

<deny users="?"/>

</authorization>

注:你可以使用user.identity.name来获取已经过验证的当前的用户名

    1. <sessionState>

为当前应用程序配置会话状态设置(如设置是否启用会话状态,会话状态保存位置)。

<sessionState mode="StateServer" cookieless="UseCookies" timeout="120" />

mode=" StateServer "表示:在本地储存会话状态(你也可以选择储存在远程服务器或SAL服务器中或不启用会话状态)

cookieless=" UseCookies " 表示:无论浏览器或设备是否支持 Cookie,都使用 Cookie 来保留用户数据。

timeout="120"表示:会话可以处于空闲状态的分钟数

5.2.2 CAS配置具体步骤

在web.config中添加CAS的相关配置信息

  1. 首先在configSections节下添加配置信息

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

  1. 然后在根节点configuration下添加

<casClientConfig

        casServerLoginUrl="http://localhost:8080/cas/login"

        casServerUrlPrefix="http://localhost:8080/cas/"

        serverName="http://YourIP:Port/ExampleWebsite"

        redirectAfterValidation="true"

        gateway="false"

        renew="false"

        singleSignOut="true"

        ticketTimeTolerance="5000"

        ticketValidatorName="Cas20"

        proxyTicketManager="CacheProxyTicketManager"

        serviceTicketManager="CacheServiceTicketManager"

        gatewayStatusCookieName="CasGatewayStatus" />

黄色CAS认证服务地址

绿色为第三方系统登录地址

  1. 然后进行Forms的认证配置

<authentication mode="Forms">

<forms

loginUrl="http://localhost:8080/cas/login"

timeout="30"

defaultUrl="~/Main.aspx"

cookieless="UseCookies"

slidingExpiration="true"

 />

    </authentication>

<authorization>

<deny users="?" />

</authorization>

注:authorizationauthentication需要一起使用才有效果

  1. 然后在system.webServer下的modules节点下添加

<remove name="DotNetCasClient"/>

  <add name="DotNetCasClient" type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>

  1. 最后在httpModules节下添加

<add name="DotNetCasClient" type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>

5.2.3 相关问题及解决办法

  • 问题一:配置后,经过单点登录的拦截遇到循环重定向问题

    解决:

  1. 去掉authentication forms元素的path属性(无效)

  2. sessionState属性配置调整(无效)

  3. 放入测试Default/Master页面等

  4. deployContext.xml要添加allowedToProxy="true"属性,但是服务器仍然有问题。问题原因:原来是认证过程中cas服务器端也要请求cas客户端,类似双向握手;把认证的地址改为配置的serverName改为外网地址,而不是localhost就可以了,因为如果是localhost,在正式服务器上的cas服务器端就找不到cas客户端了。

  • 问题二:登录系统时的URL后需要添加“/”才能进入,否则出现循环重定向的问题

解决:去掉path属性解决问题

<authentication mode="Forms">

<forms

loginUrl="http://localhost:8080/cas/login"

timeout="30"

defaultUrl="~/Main.aspx"

cookieless="UseCookies"

slidingExpiration="true"

path=/XXXX/

 />

    </authentication>

5.3 C#获取认证用户

统一身份认证配置完毕后需要,需要在.NETC#中获取登录用户名,可以采用如下方式来获取:

string userName = HttpContext.Current.User.Identity.Name;

相关说明

6.1 参考链接

  1. web.config详解参考

http://www.cnblogs.com/doublemm/archive/2011/08/25/2153235.html

  1. sessionState属性详解

http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html

6.2 附件说明

附件为配置所需动态链接库文件、完整的web.config样例文件以及样例工程用于参考,其中:DotNetCasClient是CAS的的C#工程,ExampleWebSite是样例工程,对应实际项目。

文档及附件下载https://pan.baidu.com/s/1dFGDkzv

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台