Yale CAS + .net Client 实现 SSO(3)--实现 ASP.NET WebForm Client

原文地址: http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870936.html

第一部分:安装配置 Tomcat

第二部分:安装配置 CAS

第三部分:实现 ASP.NET WebForm Client

第四部分:实现基于数据库的身份验证

第五部分:扩展基于数据库的身份验证

第六部分:自定义登录页面

第三部分:实现 ASP.NET WebForm Client

1. 下载.NET CAS client。

.NET CAS Client 下载地址:https://wiki.jasig.org/display/CASC/.Net+Cas+Client

下载“dotnet-client-1.0-Src.zip”并解压缩。

 

2. 配置 CAS DotNetClient

以管理员身份启动Visual Studio(目的为了随后可以直接将网站发布到IIS),打开“DotNetCasClient.vs2010.sln”解决方案。

(1)项目“DotNetCasProxyDemoApp”暂时用不到,从解决方案中移除。

(2)将“DotNetCasClient”项目中“Properties”文件夹下的“AssemblyInfo.cs”删除,将“AssemblyInfo.cs.tmpl”重命名为“AssemblyInfo.cs”。

(3)打开将“DotNetCasClient”项目中“Properties”文件夹下的“AssemblyInfo.cs”,将所有“$WCREV$”替换成“0”(或其它表示版本的数字)。

(4)将“ExampleWebSite”项目设置为启动项。

(5)将“ExampleWebSite”项目根文件夹下的“web.config.sample”重命名为“web.config”

(6)打开“web.config”文件,找到“casClientConfig”节点,将“casServerLoginUrl”属性设置为“https://192.168.0.123:8443/cas/login”,将“casServerUrlPrefix”属性设置为“https://192.168.0.123:8443/cas/”,将“serverName”属性设置为“http://localhost:3273/ExampleWebSite”。

说明:192.168.0.123是前面我们配置好的CAS服务器IP地址;“serverName”属性中3273为运行该项目时IISExpress自动分配的端口号,如果项目发布到客户端IIS上,建议将“serverName”属性更改为“http://192.168.0.153/ExampleWebSite”,其中192.168.0.153为客户端IP地址。注意:“serverName”属性中网络地址最后不要加“/”。

(7)从“web.config”文件中找到“authentication”节点,将“loginUrl”属性设置为“https://192.168.0.123:8443/cas/login”,将“path”属性设置为“/ExampleWebSite/”。

(8)保存全部修改,重新编译解决方案。

 

3. 调试 CAS DotNetClient

(1)鼠标右击“DotNetCasClient”项目根目录下的“Default.aspx”,选择“在浏览器中查看...”

(2)单击“Authenticated Users Only”连接,系统自动重定向到CAS登录页面(如果IE有证书警告信息,直接点击“继续浏览此网站”),此时IE会报网页有错误。

这是由于CAS中的一段脚本引起的。如图所示,调试信息指出是“cas/js/cas.js”脚本出了问题。

(3)回到IP地址为“192.168.0.123”的服务器,以管理员身份编辑“%TOMCAT_HOME%\webapps\cas\js\cas.js”,滚动到文件最下方添加两行代码并保存。如图所示:

(4)回到客户端机器,重复步骤(1),这回IE不再报网页有错误。

注意:每次运行项目时强烈建议清除IE缓存及Cookies,防止因IE缓存造成不必要的错觉。

(5)在CAS登录窗体中输入用户名和密码,均为“admin”,此时会出现登录异常,要么IE提示一遍一遍重新登录,要么IE会出现“假死”现象。如果使用Chorme浏览器,你就会发现遭遇“重定向循环”问题了。

 

4. 解决CAS DotNetClient重定向循环问题

CAS DotNetClient重定向循环问题早就有人发现了,并且提出了各种解决办法。通过检索会发现最有帮助的就是博客园“邢少”的《CAS 与.net 集成的 “循环重定向”问题分析》一文。在这篇博文中,建议用户直接增加配置:

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

其目的为:1、启用会话状态;2、开始asp.net状态服务〔确保会话的持久,不在莫名其妙的失效。〕。

然而,通过对项目“DotNetCasClient”代码的追踪和分析发现,状态信息是通过Cache存储的,与sessionState的关系应该不大。本人认为该方法并不能解决问题。

通过在“DotNetCasClient\Validation\TicketValidator\AbstractUrlTicketValidator.cs”设置断点,并通过F11逐步运行程序发现问题出在“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。”

 

因此,提供如下修改方案:

(1)在Visual Studio中打开“CASDotNetClient”项目中的“\Utils\HttpUtil.cs”文件,添加如下命名空间:

using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

(2)在HttpUtil类中增加如下方法:

internal static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
    return true;
}

(3)在PerformHttpGet方法中添加验证服务器证书回调自动验证代码,添加代码后的PerformHttpGet方法如下:

internal static string PerformHttpGet(string url, bool requireHttp200)
{
  string responseBody = null; 

  //-- 以下新添加的代码:验证服务器证书回调自动验证
  ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
  //-- 以上为新添加的代码 

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  {
    if (!requireHttp200 || response.StatusCode == HttpStatusCode.OK)
    {
      using (Stream responseStream = response.GetResponseStream())
      {
        if (responseStream != null)
        {
          using (StreamReader responseReader = new StreamReader(responseStream))
          {
            responseBody = responseReader.ReadToEnd();
          }
        }
      }
    }
  } 

  return responseBody;
}

(4)保存修改并重新生成解决方案。

 

5. 测试 CAS DotNetClient

(1)鼠标右击“DotNetCasClient”项目根目录下的“Default.aspx”,选择“在浏览器中查看...”

  

(2)单击“Authenticated Users Only”连接,系统自动重定向到CAS登录页面(如果IE有证书警告信息,直接点击“继续浏览此网站”)。

(3)输入用户名、密码(均为“admin”,或均为“bob”),CAS自动完成登录并重定向回原有网站。

至此,基于ASP.NET WebForm的CAS客户端已经完全调试通过。下面就“重定向循环”做进一步讨论讨论

 

6. 深入讨论DotNetClient重定向循环问题

这里提供两篇我从网上搜到的解决办法,并探讨解决办法存在的问题。

(1)HOWTO CASifying ASP.NET WebApp - ExampleWebsite

此文应该是官方网站上放出来的解决办法,应该具有权威性。它提供的主要解决办法就是让CAS Server和CAS Client互相信任对方的证书,从而避免SSL因不信任证书造成重定向循环。然而实际情况确是IE根本不会信任用户自己生成的证书,即便加入信任证书根列表也不行,造成“重定向循环”依然存在。

另外,此篇文章要求配置IIS支持SSL,其实根本没有必要,IIS不配置SSL也可以正常运行。当然,为了安全起见,配置SSL也没有什么坏处。

(2)博客园“邢少”的《CAS 与.net 集成的 “循环重定向”问题分析》一文

该文试图从sessionState配置上解决问题,但从本人的实践看来,“重定向循环”并未得到解决,“重定向循环”问题的本质还是SSL证书信任问题。

 

7. 关于DotNetClient注销问题

关于DotNet注销网上有很多介绍的材料。我这里就不再多说什么了。留下个链接供大家参考。《解释CAS Logout问题

为了便于查看,将《解释CAS Logout问题》一文的主要内容放在下面便于查阅:

CAS Logout是一个非常费解的问题,我在这里简单解释一下:

假设有webapp1, webapp2, cas server,webapp1, webapp2均受cas server保护。

 

第1种不能logout的情况:

1)登录了WebApp1,redirect到caserver,casserver认证后,再redirect到webapp1,ok!

2)http方式 lougout casserver1,即http://yale_casserver:8080/cas/lougout,显示logout成功

3)访问webapp2,还能访问!这是非常正常的一种情况,因为你不通过https来注销,casserver怎么“杀”掉它通过https发给你的TGC Cookie?

 

第2种不能logout的情况:

1)登录了WebApp1,redirect到caserver,casserver认证后,再redirect到webapp1,ok!

2)https方式 lougout casserver1,即https://yale_casserver:8443/cas/lougout,显示logout成功

3)访问webapp1,还能访问!访问webapp2,不能访问,重定向到casserver要求登录!这也是非常正常的一种情况,因为你已经能够访问,你继续可以继续访问,CASLogout不能阻止你访问webapp1,它只能阻止你访问webapp2,因为你已经被允许访问webapp1,而webapp2则还没有,如果你在(1)的时候,顺带也访问webapp2,那么你的注销将毫无作用了,CAS无法阻止你访问这两个webapp,因为你有Service Ticket。

如果你对此费解,那时因为你已为Logout就是退出系统,那我只能表示遗憾,因为CAS Logout的作用不是这样,它的作用是阻止你继续通过TGC(它简单地清楚了IE的TGC Cookie)来获取ST,阻止你获取通向其他web应用的Ticket。

所以,用完webapp1的时候,注销,然后再关闭掉IE就彻底Logout了。

 

待续...

时间: 2024-12-06 17:48:47

Yale CAS + .net Client 实现 SSO(3)--实现 ASP.NET WebForm Client的相关文章

在Tomcat中使用Yale CAS实现单点登陆(SSO)

<!--[if !supportEmptyParas]--> <!--[endif]--> 耶鲁大学开发的单点登录系统称为CAS(Central Authentication Server)被设计成一个独立的Web应用程序(cas.war).它目前用几个Java Servlet作为实现并且通过一个Https服务器来运行.要使用单点登陆功能的Web应用作为CAS的一个客户端来运行. 由于CAS使用Https协议,所以首先要知道如何在容器中配置SSL.Tomcat的SSL配置相对其它的

Yale CAS + .net Client 实现 SSO(4)--实现基于数据库的身份验证

原文地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/26/2878271.html 第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 第五部分:扩展基于数据库的身份验证 第六部分:自定义登录页面 第四部分:实现基于数据库的身份验证 1.下载 Microsoft JDBC Driver for SQL Server. (1)Micros

Yale CAS + .net Client 实现 SSO(5)--扩展基于数据库的身份验证

原文地址: http://www.cnblogs.com/zhenyulu/archive/2013/01/27/2878935.html 第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 第五部分:扩展基于数据库的身份验证 第六部分:自定义登录页面 第五部分:扩展基于数据库的身份验证 1. 应用场景 前面提到的基于数据库的集中身份验证主要是通过用户名.密码的方式完成验证操作,然而在实际

Yale CAS + .net Client 实现 SSO(2)--安装配置 CAS

原文地址: http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870890.html 第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 第五部分:扩展基于数据库的身份验证 第六部分:自定义登录页面 第二部分:安装配置 CAS 1. 下载 CAS 及.NET CAS client. CAS下载地址:http://www.jasig.or

Yale CAS + .net Client 实现 SSO(6)--自定义登录页面

原文地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/31/2883863.html 第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 第五部分:扩展基于数据库的身份验证 第六部分:自定义登录页面 第六部分:自定义登录页面 1. 离线定义登录页面 CAS登录页面存放在"%TOMCAT_HOME%\webapps\cas\WEB-INF\

Yale CAS + .net Client 实现 SSO 的完整版

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.    ----------------------------------------------------------------------------

CAS解决单点登录SSO

关于CAS很多的原理和基础的配置启动,网上是很多的,我更多是结合我的实践和心得.需要了解CAS的原理,认证协议,认证流程,可以参考以下文章. 让CAS支持客户端自定义登陆页面--客户端篇 CAS原理与配置-基于CAS的单点登陆的研究(上) 服务端配置 CAS单点登陆部署 CAS配置手册 CAS单点登录配置 背景 单点登录(SSO)是企业开发的重要问题,在我的毕设项目中,由于要和系统其他开发模块共用用户认证模块,方便共享用户资源,所以需要一个好的SSO解决方案. 一般SSO的实现机制有两种:基于s

企业IT项目开发之七宗罪(下篇)

即使没有翅膀,心......也要飞翔! 在新年前一天预祝大家新年好,在新的一年里工作顺利,身体健康. 前一阵公司给我下达了任务,一直在忙着打造面向SAAS的企业级微信平台,彻底实现零代码配置,小小一个微信,当面向企业级而且是SAAS时,呵呵,还真的有许多需要注意的地方,非常感谢公司内最强的业务架构师我们的大姐设计出来这么优秀的一款全动态微信业务.所以写完了中篇,一直没时间来得及写下篇. 下篇的开头,大家也看到了标题:即使没有翅膀,心也要飞翔!!! 为什么提这个标题呢?企业IT项目开发之七宗罪上.

Microsoft NLayerApp“.NET研究”案例理论与实践 - 项目简介与环境搭建

项目简介 Microsoft – Spain团队有一个很不错的面向领域多层分布式项目案例:Microsoft – Domain Oriented N-Layered .NET 4.0 App Sample(在本系列文章中,我使用NLayerApp作为该项目的名称进行介绍),在codeplex上的地址是:http://microsoftnlayerapp.codeplex.com/. 它是学习领域驱动设计(DDD)的一个非常不错的案例项目.该项目采用的是经典的DDD架构,而不是CQRS架构,但我觉