惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
美团技术团队
N
Netflix TechBlog - Medium
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
The Cloudflare Blog
量子位
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
DataBreaches.Net
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - 吕震宇

Yale CAS + .net Client 实现 SSO(6) Yale CAS + .net Client 实现 SSO(5) Yale CAS + .net Client 实现 SSO(4) Yale CAS + .net Client 实现 SSO(2) Yale CAS + .net Client 实现 SSO(1) Windows Mobile 数独游戏及全部源码 SharpICTCLAS 1.0 发布! SharpICTCLAS(测试版)发布了 SharpICTCLAS分词系统简介(7)(8) SharpICTCLAS分词系统简介(6)Segment SharpICTCLAS分词系统简介(5)NShortPath-2 SharpICTCLAS分词系统简介(4)NShortPath-1 SharpICTCLAS分词系统简介(3)DynamicArray SharpICTCLAS分词系统简介(1)、(2) 实现ICTCLAS到C#平台的移植 天书般的ICTCLAS分词系统代码(二) 天书般的ICTCLAS分词系统代码(一) 给文章增加“Copy Code”功能 [转][黄忠成]Object Builder Application Block
Yale CAS + .net Client 实现 SSO(3)
吕震宇 · 2013-01-22 · via 博客园 - 吕震宇

第三部分:实现 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%\webapps\cas\js\cas.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的关系应该不大。本人认为该方法并不能解决问题。

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

CAS003011 

CAS003012

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

(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”,选择“在浏览器中查看...”

  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了。

待续...