zoukankan      html  css  js  c++  java
  • (转)Yale CAS + .net Client 实现 SSO(3)

    • 第一部分:安装配置 Tomcat
    • 第二部分:安装配置 CAS

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

    1. 下载.NET CAS client。

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

    CAS003001

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

    CAS003002

    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”(或其它表示版本的数字)。

    CAS003003

    (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”。

    CAS003004

    说明: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/”。

    CAS003005

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

    3. 调试 CAS DotNetClient

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

    CAS003006

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

    CAS003007

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

    CAS003008

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

    CAS003009

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

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

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

    CAS003010

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

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

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

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

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

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

    CAS003011 

    CAS003012

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

    (1)在Visual Studio中打开“CASDotNetClient”项目中的“UtilsHttpUtil.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”,选择“在浏览器中查看...”

      CAS003006

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

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

    CAS003013

    CAS003014

    CAS003015

    CAS003016

    至此,基于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了。

  • 相关阅读:
    MySQL锁机制和主从复制
    MySQL索引优化
    MySQL的Explain
    事务并发问题和隔离级别
    解决angular单页面页面底部跳转到新页面滚动条不在顶部的问题
    关于字符串在ie浏览器拼接问题
    angular 新建命令
    angular 多路由模块新建组件的方法
    Angular 4.x NgClass ngStyle 指令用法
    slideDown()、slideUp()反复执行的问题
  • 原文地址:https://www.cnblogs.com/ywcz060/p/4760103.html
Copyright © 2011-2022 走看看