搜索 | 会员  
asp.net真正实现完全跨域单点登录
来源: CSDN博客   作者:网友  日期:2016/10/19  类别:编程语言  主题:.NET  编辑:泽文
单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用

源代码下载:http://download.csdn.net/source/1571879 

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

asp.net跨域单点登录分为:

1、跨子域单点登录。如 blog.a.com 和 info.a.com 这2个站点同属一个主域.a.com,实现跨子域单点登录很简单,可以利用cookie,设置Domain为".a.com'即可,这里就不再赘叙。

2、完成跨域单点登录。如 http://www.a.com/   http://www.b.com/ 这2个站点之间实现共享一个身份验证系统,只需在一处地方登录,下面主要谈下这种方式的实现方法。 

asp.net 跨域单点登录实现原理:
当用户第一次访问web应用系统1的时候,因为还没有登录,会被引导到认证中心进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,返回给用户一个认证的凭据;用户再访问别的web应用的时候就会将这个Token带上,作为自己认证的凭据,应用系统接受到请求之后会把Token送到认证中心进行效验,检查Token的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。所有应用系统共享一个身份认证系统。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志,返还给用户。另外,认证系统还应该对Token进行效验,判断其有效性。 所有应用系统能够识别和提取Token信息要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对Token进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。

比如说,我现在有3个分站点和1个认证中心(总站)。当用户访问分站点的时候,分站点会发Token到验证中心进行验证。验证中心判断用户是否已经登录。如果未登录,则返回到验证中心登录入口进行登录,否之则返回Token验证到分站点,直接进入分站点。


如图所示:

单点登录流程图

上面是实现单点登录的原理图,下面介绍下如何用asp.net实现跨域单点登录:

一、新建网站 MasterSite,作为总站认证中心。配置web.config,采用form登录验证。
      配置如下:

  1. <authenticationmode="Forms">

  2. <formsname=".AspxFormAuth"loginUrl="Default.aspx"defaultUrl="center.html"protection="All"path="/"timeout="120">

  3. </forms>

  4. </authentication>

  5. <authorization>

  6. <!--拒绝所有匿名用户-->

  7. <denyusers="?"/>

  8. </authorization>

[xhtml] view plain copy print?

  1. <authenticationmode="Forms">

  2.   <formsname=".AspxFormAuth"loginUrl="Default.aspx"defaultUrl="center.html"protection="All"path="/"timeout="120">

  3.   </forms>

  4. </authentication>

  5. <authorization>

  6.     <!--拒绝所有匿名用户-->

  7.     <denyusers="?"/>

  8. </authorization>

      添加Default.aspx页面,用来进行登录。代码如下:
   

     HTML Code:
    

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>   

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   

  3. <html xmlns="http://www.w3.org/1999/xhtml" >   

  4. <head runat="server">   

  5.     <title>总站登录</title>   

  6. </head>   

  7. <body>   

  8.     <form id="form1" runat="server">   

  9.     <div>   

  10.         <asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate" UserName="test">   

  11.         </asp:Login>   

  12.     </div>   

  13.     </form>   

  14. </body>   

  15. </html>  

[c-sharp] view plain copy print?

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>  

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

  3. <html xmlns="http://www.w3.org/1999/xhtml" >  

  4. <head runat="server">  

  5.     <title>总站登录</title>  

  6. </head>  

  7. <body>  

  8.     <form id="form1" runat="server">  

  9.     <div>  

  10.         <asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate" UserName="test">  

  11.         </asp:Login>  

  12.     </div>  

  13.     </form>  

  14. </body>  

  15. </html>  


   Default.cs Code:

  1. using System;   

  2. using System.Data;   

  3. using System.Configuration;   

  4. using System.Web;   

  5. using System.Web.Security;   

  6. using System.Web.UI;   

  7. using System.Web.UI.WebControls;   

  8. using System.Web.UI.WebControls.WebParts;   

  9. using System.Web.UI.HtmlControls;   

  10. using System.Text;   

  11. public partial class _Default : System.Web.UI.Page    

  12. {   

  13. protectedvoid Page_Load(object sender, EventArgs e)   

  14.     {   

  15. if (!IsPostBack)   

  16.         {   

  17.             SSORequest ssoRequest = new SSORequest();  

  18.  

  19.  

  20.             #region 验证 Post 过来的参数 

  21. //-------------------------------- 

  22. // 请求注销 

  23. if (!string.IsNullOrEmpty(Request["Logout"]))   

  24.             {   

  25.                 Authentication.Logout();   

  26. return;   

  27.             }   

  28. //-------------------------------- 

  29. // 各独立站点标识 

  30. if (string.IsNullOrEmpty(Request["IASID"]))   

  31.             {   

  32. return;   

  33.             }   

  34. else

  35.             {   

  36.                 ssoRequest.IASID = Request["IASID"];   

  37.             }   

  38. //-------------------------------- 

  39. // 时间戳 

  40. if (string.IsNullOrEmpty(Request["TimeStamp"]))   

  41.             {   

  42. return;   

  43.             }   

  44. else

  45.             {   

  46.                 ssoRequest.TimeStamp = Request["TimeStamp"];   

  47.             }   

  48. //-------------------------------- 

  49. // 各独立站点的访问地址 

  50. if (string.IsNullOrEmpty(Request["AppUrl"]))   

  51.             {   

  52. return;   

  53.             }   

  54. else

  55.             {   

  56.                 ssoRequest.AppUrl = Request["AppUrl"];   

  57.             }   

  58. //-------------------------------- 

  59. // 各独立站点的 Token 

  60. if (string.IsNullOrEmpty(Request["Authenticator"]))   

  61.             {   

  62. return;   

  63.             }   

  64. else

  65.             {   

  66.                 ssoRequest.Authenticator = Request["Authenticator"];   

  67.             }   

  68.             ViewState["SSORequest"] = ssoRequest;  

  69.  

  70.             #endregion 

  71. //验证从分站发过来的Token 

  72. if (Authentication.ValidateAppToken(ssoRequest))   

  73.             {   

  74. string userAccount = null;   

  75. // 验证用户之前是否登录过 

  76. //验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号 

  77. if (Authentication.ValidateEACCookie(out userAccount))   

  78.                 {   

  79.                     ssoRequest.UserAccount = userAccount;   

  80. //创建认证中心发往各分站的 Token 

  81. if (Authentication.CreateEACToken(ssoRequest))   

  82.                     {   

  83.                         Post(ssoRequest);   

  84.                     }   

  85.                 }   

  86. else

  87.                 {   

  88. return;   

  89.                 }   

  90.             }   

  91. else

  92.             {   

  93. return;   

  94.             }   

  95.         }   

  96.     }   

  97. //post请求 

  98. void Post(SSORequest ssoRequest)   

  99.     {   

  100.         PostService ps = new PostService();   

  101.         ps.Url = ssoRequest.AppUrl;   

  102.         ps.Add("UserAccount", ssoRequest.UserAccount);   

  103.         ps.Add("IASID", ssoRequest.IASID);   

  104.         ps.Add("TimeStamp", ssoRequest.TimeStamp);   

  105.         ps.Add("AppUrl", ssoRequest.AppUrl);   

  106.         ps.Add("Authenticator", ssoRequest.Authenticator);   

  107.         ps.Post();   

  108.     }   

  109. /// <summary> 

  110. /// 验证登录账号和密码是否正确 

  111. /// </summary> 

  112. /// <param name="userName">登录账号</param> 

  113. /// <param name="userPwd">登录密码</param> 

  114. /// <returns></returns> 

  115. privatebool ValidateUserInfo(string userName, string userPwd)   

  116.     {   

  117. //从数据库中读取,验证登录账号和密码 

  118. //略... 

  119. returntrue;   

  120.     }   

  121. protectedvoid Login1_Authenticate(object sender, AuthenticateEventArgs e)   

  122.     {   

  123. if (string.IsNullOrEmpty(Login1.UserName) || string.IsNullOrEmpty(Login1.Password))   

  124.         {   

  125.             Page.RegisterClientScriptBlock("Add", "<mce:script lanuage=\"javascript\"><!--   

  126. alert('用户名密码不能为空!');   

  127. // --></mce:script>"); 

  128. return;   

  129.         }   

  130. elseif (ValidateUserInfo(Login1.UserName, Login1.Password) == false)   

  131.         {   

  132.             Page.RegisterClientScriptBlock("Add", "<mce:script lanuage=\"javascript\"><!--   

  133. alert('用户名密码错误!');   

  134. // --></mce:script>"); 

  135. return;   

  136.         }   

  137. else

  138.         {   

  139.             Session["CurrUserName"] = Login1.UserName;   

  140.             Session.Timeout = 120;   

  141.             SSORequest ssoRequest = ViewState["SSORequest"] as SSORequest;   

  142. // 如果不是从各分站 Post 过来的请求,则默认登录主站 

  143. if (ssoRequest == null)   

  144.             {   

  145.                 FormsAuthentication.SetAuthCookie(Login1.UserName, false);   

  146.                 ssoRequest = new SSORequest();   

  147. //主站标识ID 

  148.                 ssoRequest.IASID = "00";   

  149.                 ssoRequest.AppUrl = "SiteList.aspx";   

  150.                 ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");   

  151.                 ssoRequest.Authenticator = string.Empty;   

  152.                 Response.Redirect("SiteList.aspx");   

  153.             }   

  154.             ssoRequest.UserAccount = Login1.UserName;   

  155. //创建Token 

  156. if (Authentication.CreateEACToken(ssoRequest))   

  157.             {   

  158. string expireTime = DateTime.Now.AddHours(3).ToString("yyyy-MM-dd HH:mm");   

  159.                 Authentication.CreatEACCookie(ssoRequest.UserAccount, ssoRequest.TimeStamp, expireTime);   

  160.                 Post(ssoRequest);   

  161.             }   

  162.         }   

  163.     }   

  164. }  

[c-sharp] view plain copy print?

  1. using System;  

  2. using System.Data;  

  3. using System.Configuration;  

  4. using System.Web;  

  5. using System.Web.Security;  

  6. using System.Web.UI;  

  7. using System.Web.UI.WebControls;  

  8. using System.Web.UI.WebControls.WebParts;  

  9. using System.Web.UI.HtmlControls;  

  10. using System.Text;  

  11. public partial class _Default : System.Web.UI.Page   

  12. {  

  13.     protectedvoid Page_Load(object sender, EventArgs e)  

  14.     {  

  15.         if (!IsPostBack)  

  16.         {  

  17.             SSORequest ssoRequest = new SSORequest();  

  18.             #region 验证 Post 过来的参数

  19.             //--------------------------------

  20.             // 请求注销

  21.             if (!string.IsNullOrEmpty(Request["Logout"]))  

  22.             {  

  23.                 Authentication.Logout();  

  24.                 return;  

  25.             }  

  26.             //--------------------------------

  27.             // 各独立站点标识

  28.             if (string.IsNullOrEmpty(Request["IASID"]))  

  29.             {  

  30.                 return;  

  31.             }  

  32.             else

  33.             {  

  34.                 ssoRequest.IASID = Request["IASID"];  

  35.             }  

  36.             //--------------------------------

  37.             // 时间戳

  38.             if (string.IsNullOrEmpty(Request["TimeStamp"]))  

  39.             {  

  40.                 return;  

  41.             }  

  42.             else

  43.             {  

  44.                 ssoRequest.TimeStamp = Request["TimeStamp"];  

  45.             }  

  46.             //--------------------------------

  47.             // 各独立站点的访问地址

  48.             if (string.IsNullOrEmpty(Request["AppUrl"]))  

  49.             {  

  50.                 return;  

  51.             }  

  52.             else

  53.             {  

  54.                 ssoRequest.AppUrl = Request["AppUrl"];  

  55.             }  

  56.             //--------------------------------

  57.             // 各独立站点的 Token

  58.             if (string.IsNullOrEmpty(Request["Authenticator"]))  

  59.             {  

  60.                 return;  

  61.             }  

  62.             else

  63.             {  

  64.                 ssoRequest.Authenticator = Request["Authenticator"];  

  65.             }  

  66.             ViewState["SSORequest"] = ssoRequest;  

  67.             #endregion

  68.             //验证从分站发过来的Token

  69.             if (Authentication.ValidateAppToken(ssoRequest))  

  70.             {  

  71.                 string userAccount = null;  

  72.                 // 验证用户之前是否登录过

  73.                 //验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号

  74.                 if (Authentication.ValidateEACCookie(out userAccount))  

  75.                 {  

  76.                     ssoRequest.UserAccount = userAccount;  

  77.                     //创建认证中心发往各分站的 Token

  78.                     if (Authentication.CreateEACToken(ssoRequest))  

  79.                     {  

  80.                         Post(ssoRequest);  

  81.                     }  

  82.                 }  

  83.                 else

  84.                 {  

  85.                     return;  

  86.                 }  

  87.             }  

  88.             else

  89.             {  

  90.                 return;  

  91.             }  

  92.         }  

  93.     }  

  94.     //post请求

  95.     void Post(SSORequest ssoRequest)  

  96.     {  

  97.         PostService ps = new PostService();  

  98.         ps.Url = ssoRequest.AppUrl;  

  99.         ps.Add("UserAccount", ssoRequest.UserAccount);  

  100.         ps.Add("IASID", ssoRequest.IASID);  

  101.         ps.Add("TimeStamp", ssoRequest.TimeStamp);  

  102.         ps.Add("AppUrl", ssoRequest.AppUrl);  

  103.         ps.Add("Authenticator", ssoRequest.Authenticator);  

  104.         ps.Post();  

  105.     }  

  106.     /// <summary>

  107.     /// 验证登录账号和密码是否正确

  108.     /// </summary>

  109.     /// <param name="userName">登录账号</param>

  110.     /// <param name="userPwd">登录密码</param>

  111.     /// <returns></returns>

  112.     privatebool ValidateUserInfo(string userName, string userPwd)  

  113.     {  

  114.         //从数据库中读取,验证登录账号和密码

  115.         //略...

  116.         returntrue;  

  117.     }  

  118.     protectedvoid Login1_Authenticate(object sender, AuthenticateEventArgs e)  

  119.     {  

  120.         if (string.IsNullOrEmpty(Login1.UserName) || string.IsNullOrEmpty(Login1.Password))  

  121.         {  

  122.             Page.RegisterClientScriptBlock("Add", "<mce:script lanuage=\"javascript\"><!--  

  123. alert('用户名密码不能为空!');  

  124. // --></mce:script>");

  125.             return;  

  126.         }  

  127.         elseif (ValidateUserInfo(Login1.UserName, Login1.Password) == false)  

  128.         {  

  129.             Page.RegisterClientScriptBlock("Add", "<mce:script lanuage=\"javascript\"><!--  

  130. alert('用户名密码错误!');  

  131. // --></mce:script>");

  132.             return;  

  133.         }  

  134.         else

  135.         {  

  136.             Session["CurrUserName"] = Login1.UserName;  

  137.             Session.Timeout = 120;  

  138.             SSORequest ssoRequest = ViewState["SSORequest"] as SSORequest;  

  139.             // 如果不是从各分站 Post 过来的请求,则默认登录主站

  140.             if (ssoRequest == null)  

  141.             {  

  142.                 FormsAuthentication.SetAuthCookie(Login1.UserName, false);  

  143.                 ssoRequest = new SSORequest();  

  144.                 //主站标识ID

  145.                 ssoRequest.IASID = "00";  

  146.                 ssoRequest.AppUrl = "SiteList.aspx";  

  147.                 ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");  

  148.                 ssoRequest.Authenticator = string.Empty;  

  149.                 Response.Redirect("SiteList.aspx");  

  150.             }  

  151.             ssoRequest.UserAccount = Login1.UserName;  

  152.             //创建Token

  153.             if (Authentication.CreateEACToken(ssoRequest))  

  154.             {  

  155.                 string expireTime = DateTime.Now.AddHours(3).ToString("yyyy-MM-dd HH:mm");  

  156.                 Authentication.CreatEACCookie(ssoRequest.UserAccount, ssoRequest.TimeStamp, expireTime);  

  157.                 Post(ssoRequest);  

  158.             }  

  159.         }  

  160.     }  

  161. }  

 代码说明:验证分站post过来的Token请求,如果用户已经登录,则创建认证中心发往各分站的 Token验证,转向分站,否之则返回登录。若是直接登录主站则转向站点选择页面sitelist.aspx,选择你要登录的分站点。
如图:

主站登录

选择站点

二、新建站点1,代码如下:

HTML Code:

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>   

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   

  3. <html xmlns="http://www.w3.org/1999/xhtml" >   

  4. <head runat="server">   

  5.     <title> 站点一</title>   

  6. </head>   

  7. <body>   

  8.     <form id="form1" runat="server">   

  9.     <div>   

  10.         <br />   

  11.         <br />   

  12.         <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">返回主站</asp:LinkButton>   

  13.         <asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkButton2_Click">注销登录</asp:LinkButton></div>   

  14.     </form>   

  15. </body>   

  16. </html>  

[c-sharp] view plain copy print?

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>  

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

  3. <html xmlns="http://www.w3.org/1999/xhtml" >  

  4. <head runat="server">  

  5.     <title> 站点一</title>  

  6. </head>  

  7. <body>  

  8.     <form id="form1" runat="server">  

  9.     <div>  

  10.         <br />  

  11.         <br />  

  12.         <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">返回主站</asp:LinkButton>  

  13.         <asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkButton2_Click">注销登录</asp:LinkButton></div>  

  14.     </form>  

  15. </body>  

  16. </html>  

Default.cs code:

  1. using System;   

  2. using System.Data;   

  3. using System.Configuration;   

  4. using System.Web;   

  5. using System.Web.Security;   

  6. using System.Web.UI;   

  7. using System.Web.UI.WebControls;   

  8. using System.Web.UI.WebControls.WebParts;   

  9. using System.Web.UI.HtmlControls;   

  10. using System.Text;   

  11. public partial class _Default : System.Web.UI.Page    

  12. {   

  13. protectedvoid Page_Load(object sender, EventArgs e)   

  14.     {   

  15. if (!IsPostBack)   

  16.         {  

  17.             #region SSO 部分代码 

  18.             SSORequest ssoRequest = new SSORequest();   

  19. if (string.IsNullOrEmpty(Request["IASID"]))   

  20.             {   

  21.                 ssoRequest.IASID = "01";   

  22.                 ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");   

  23.                 ssoRequest.AppUrl = Request.Url.ToString();   

  24.                 Authentication.CreateAppToken(ssoRequest);   

  25.                 Post(ssoRequest);   

  26.             }   

  27. elseif (!string.IsNullOrEmpty(Request["IASID"])   

  28.                 && !string.IsNullOrEmpty(Request["TimeStamp"])   

  29.                 && !string.IsNullOrEmpty(Request["AppUrl"])   

  30.                 && !string.IsNullOrEmpty(Request["UserAccount"])   

  31.                 && !string.IsNullOrEmpty(Request["Authenticator"]))   

  32.             {   

  33.                 ssoRequest.IASID = Request["IASID"];   

  34.                 ssoRequest.TimeStamp = Request["TimeStamp"];   

  35.                 ssoRequest.AppUrl = Request["AppUrl"];   

  36.                 ssoRequest.UserAccount = Request["UserAccount"];   

  37.                 ssoRequest.Authenticator = Request["Authenticator"];   

  38. if (Authentication.ValidateEACToken(ssoRequest))   

  39.                 {   

  40. //从数据库中获取UserId 

  41.                     Session["CurrUserName"] = Request["UserAccount"];   

  42.                     Session.Timeout = 120;   

  43.                     FormsAuthentication.SetAuthCookie(Request["UserAccount"], false);   

  44.                     Response.Write(string.Format("{0},您好!欢迎来到site1,  >> 访问<a href="\" mce_href="\""http://localhost/Site2/Default.aspx\">site2</a>",ssoRequest.UserAccount)); 

  45.                 }   

  46.             }   

  47.             ViewState["SSORequest"] = ssoRequest;  

  48.  

  49.             #endregion 

  50.         }   

  51.     }   

  52. void Post(SSORequest ssoRequest)   

  53.     {   

  54.         PostService ps = new PostService();   

  55. //认证中心(主站)地址 

  56. string EACUrl = "http://localhost/MasterSite/Default.aspx";   

  57.         ps.Url = EACUrl;   

  58. //ps.Add("UserAccount", ssoRequest.UserAccount); 

  59.         ps.Add("IASID", ssoRequest.IASID);   

  60.         ps.Add("TimeStamp", ssoRequest.TimeStamp);   

  61.         ps.Add("AppUrl", ssoRequest.AppUrl);   

  62.         ps.Add("Authenticator", ssoRequest.Authenticator);   

  63.         ps.Post();   

  64.     }   

  65. //注销登录 

  66. protectedvoid LinkButton2_Click(object sender, EventArgs e)   

  67.     {   

  68.         FormsAuthentication.SignOut();   

  69.         SSORequest ssoRequest = new SSORequest();   

  70.         ssoRequest.IASID = "01";   

  71.         ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");   

  72.         ssoRequest.AppUrl = Request.Url.ToString();   

  73.         Authentication.CreateAppToken(ssoRequest);   

  74.         PostService ps = new PostService();   

  75. //认证中心(主站)地址 

  76. string EACUrl = "http://localhost/MasterSite/Default.aspx";   

  77.         ps.Url = EACUrl;   

  78.         ps.Add("IASID", ssoRequest.IASID);   

  79.         ps.Add("TimeStamp", ssoRequest.TimeStamp);   

  80.         ps.Add("AppUrl", ssoRequest.AppUrl);   

  81.         ps.Add("Authenticator", ssoRequest.Authenticator);   

  82.         ps.Add("Logout", "true");   

  83.         ps.Post();   

  84.     }   

  85. //返回主站 

  86. protectedvoid LinkButton1_Click(object sender, EventArgs e)   

  87.     {   

  88. if (Session["CurrUserName"] != null)   

  89.         {   

  90.             Response.Redirect("http://localhost/MasterSite/SiteList.aspx");   

  91.         }   

  92.     }   

  93. }  

[c-sharp] view plain copy print?

  1. using System;  

  2. using System.Data;  

  3. using System.Configuration;  

  4. using System.Web;  

  5. using System.Web.Security;  

  6. using System.Web.UI;  

  7. using System.Web.UI.WebControls;  

  8. using System.Web.UI.WebControls.WebParts;  

  9. using System.Web.UI.HtmlControls;  

  10. using System.Text;  

  11. public partial class _Default : System.Web.UI.Page   

  12. {  

  13.     protectedvoid Page_Load(object sender, EventArgs e)  

  14.     {  

  15.         if (!IsPostBack)  

  16.         {  

  17.             #region SSO 部分代码

  18.             SSORequest ssoRequest = new SSORequest();  

  19.             if (string.IsNullOrEmpty(Request["IASID"]))  

  20.             {  

  21.                 ssoRequest.IASID = "01";  

  22.                 ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");  

  23.                 ssoRequest.AppUrl = Request.Url.ToString();  

  24.                 Authentication.CreateAppToken(ssoRequest);  

  25.                 Post(ssoRequest);  

  26.             }  

  27.             elseif (!string.IsNullOrEmpty(Request["IASID"])  

  28.                 && !string.IsNullOrEmpty(Request["TimeStamp"])  

  29.                 && !string.IsNullOrEmpty(Request["AppUrl"])  

  30.                 && !string.IsNullOrEmpty(Request["UserAccount"])  

  31.                 && !string.IsNullOrEmpty(Request["Authenticator"]))  

  32.             {  

  33.                 ssoRequest.IASID = Request["IASID"];  

  34.                 ssoRequest.TimeStamp = Request["TimeStamp"];  

  35.                 ssoRequest.AppUrl = Request["AppUrl"];  

  36.                 ssoRequest.UserAccount = Request["UserAccount"];  

  37.                 ssoRequest.Authenticator = Request["Authenticator"];  

  38.                 if (Authentication.ValidateEACToken(ssoRequest))  

  39.                 {  

  40.                     //从数据库中获取UserId

  41.                     Session["CurrUserName"] = Request["UserAccount"];  

  42.                     Session.Timeout = 120;  

  43.                     FormsAuthentication.SetAuthCookie(Request["UserAccount"], false);  

  44.                     Response.Write(string.Format("{0},您好!欢迎来到site1,  >> 访问<a href="\" mce_href="\""http://localhost/Site2/Default.aspx\">site2</a>",ssoRequest.UserAccount));

  45.                 }  

  46.             }  

  47.             ViewState["SSORequest"] = ssoRequest;  

  48.             #endregion

  49.         }  

  50.     }  

  51.     void Post(SSORequest ssoRequest)  

  52.     {  

  53.         PostService ps = new PostService();  

  54.         //认证中心(主站)地址

  55.         string EACUrl = "http://localhost/MasterSite/Default.aspx";  

  56.         ps.Url = EACUrl;  

  57.         //ps.Add("UserAccount", ssoRequest.UserAccount);

  58.         ps.Add("IASID", ssoRequest.IASID);  

  59.         ps.Add("TimeStamp", ssoRequest.TimeStamp);  

  60.         ps.Add("AppUrl", ssoRequest.AppUrl);  

  61.         ps.Add("Authenticator", ssoRequest.Authenticator);  

  62.         ps.Post();  

  63.     }  

  64.     //注销登录

  65.     protectedvoid LinkButton2_Click(object sender, EventArgs e)  

  66.     {  

  67.         FormsAuthentication.SignOut();  

  68.         SSORequest ssoRequest = new SSORequest();  

  69.         ssoRequest.IASID = "01";  

  70.         ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");  

  71.         ssoRequest.AppUrl = Request.Url.ToString();  

  72.         Authentication.CreateAppToken(ssoRequest);  

  73.         PostService ps = new PostService();  

  74.         //认证中心(主站)地址

  75.         string EACUrl = "http://localhost/MasterSite/Default.aspx";  

  76.         ps.Url = EACUrl;  

  77.         ps.Add("IASID", ssoRequest.IASID);  

  78.         ps.Add("TimeStamp", ssoRequest.TimeStamp);  

  79.         ps.Add("AppUrl", ssoRequest.AppUrl);  

  80.         ps.Add("Authenticator", ssoRequest.Authenticator);  

  81.         ps.Add("Logout", "true");  

  82.         ps.Post();  

  83.     }  

  84.     //返回主站

  85.     protectedvoid LinkButton1_Click(object sender, EventArgs e)  

  86.     {  

  87.         if (Session["CurrUserName"] != null)  

  88.         {  

  89.             Response.Redirect("http://localhost/MasterSite/SiteList.aspx");  

  90.         }  

  91.     }  

  92. }  

配置web.config

  1. <authentication mode="Forms">   

  2.             <forms name=".AspxFormAuth" loginUrl="Default.aspx" defaultUrl="center.html" protection="All" path="/" timeout="60">   

  3.             </forms>   

  4.         </authentication>   

  5.         <authorization>   

  6.             <!--拒绝所有匿名用户-->   

  7.             <deny users="?"/>   

  8.         </authorization>  

[c-sharp] view plain copy print?

  1. <authentication mode="Forms">  

  2.             <forms name=".AspxFormAuth" loginUrl="Default.aspx" defaultUrl="center.html" protection="All" path="/" timeout="60">  

  3.             </forms>  

  4.         </authentication>  

  5.         <authorization>  

  6.             <!--拒绝所有匿名用户-->  

  7.             <deny users="?"/>  

  8.         </authorization>  

三、同二一样,新建站点Site2,代码如下:

  1. using System;   

  2. using System.Data;   

  3. using System.Configuration;   

  4. using System.Web;   

  5. using System.Web.Security;   

  6. using System.Web.UI;   

  7. using System.Web.UI.WebControls;   

  8. using System.Web.UI.WebControls.WebParts;   

  9. using System.Web.UI.HtmlControls;   

  10. public partial class _Default : System.Web.UI.Page   

  11. {   

  12. protectedvoid Page_Load(object sender, EventArgs e)   

  13.     {   

  14. if (!IsPostBack)   

  15.         {  

  16.             #region SSO 部分代码 

  17.             SSORequest ssoRequest = new SSORequest();   

  18. if (string.IsNullOrEmpty(Request["IASID"]))   

  19.             {   

  20.                 ssoRequest.IASID = "02";   

  21.                 ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");   

  22.                 ssoRequest.AppUrl = Request.Url.ToString();   

  23.                 Authentication.CreateAppToken(ssoRequest);   

  24.                 Post(ssoRequest);   

  25.             }   

  26. elseif (!string.IsNullOrEmpty(Request["IASID"])   

  27.                 && !string.IsNullOrEmpty(Request["TimeStamp"])   

  28.                 && !string.IsNullOrEmpty(Request["AppUrl"])   

  29.                 && !string.IsNullOrEmpty(Request["UserAccount"])   

  30.                 && !string.IsNullOrEmpty(Request["Authenticator"]))   

  31.             {   

  32.                 ssoRequest.IASID = Request["IASID"];   

  33.                 ssoRequest.TimeStamp = Request["TimeStamp"];   

  34.                 ssoRequest.AppUrl = Request["AppUrl"];   

  35.                 ssoRequest.UserAccount = Request["UserAccount"];   

  36.                 ssoRequest.Authenticator = Request["Authenticator"];   

  37. if (Authentication.ValidateEACToken(ssoRequest))   

  38.                 {   

  39.                     Session["CurrUserName"] = Request["UserAccount"];   

  40.                     Session.Timeout = 120;   

  41.                     FormsAuthentication.SetAuthCookie(Request["UserAccount"], false);   

  42.                     Response.Write(string.Format("{0},您好!欢迎来到site2,  >> 访问<a href="\" mce_href="\""http://localhost/Site1/Default.aspx\">site1</a>", ssoRequest.UserAccount)); 

  43.                 }   

  44.             }   

  45.             ViewState["SSORequest"] = ssoRequest;  

  46.  

  47.             #endregion 

  48.         }   

  49.     }   

  50. void Post(SSORequest ssoRequest)   

  51.     {   

  52.         PostService ps = new PostService();   

  53. //认证中心(主站)地址 

  54. string EACUrl = "http://localhost/MasterSite/Default.aspx";   

  55.         ps.Url = EACUrl;   

  56. //ps.Add("UserAccount", ssoRequest.UserAccount); 

  57.         ps.Add("IASID", ssoRequest.IASID);   

  58.         ps.Add("TimeStamp", ssoRequest.TimeStamp);   

  59.         ps.Add("AppUrl", ssoRequest.AppUrl);   

  60.         ps.Add("Authenticator", ssoRequest.Authenticator);   

  61.         ps.Post();   

  62.     }   

  63. //注销登录 

  64. protectedvoid LinkButton2_Click(object sender, EventArgs e)   

  65.     {   

  66.         FormsAuthentication.SignOut();   

  67.         SSORequest ssoRequest = new SSORequest();   

  68.         ssoRequest.IASID = "02";   

  69.         ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");   

  70.         ssoRequest.AppUrl = Request.Url.ToString();   

  71.         Authentication.CreateAppToken(ssoRequest);   

  72.         PostService ps = new PostService();   

  73. //认证中心(主站)地址 

  74. string EACUrl = "http://localhost/MasterSite/Default.aspx";   

  75.         ps.Url = EACUrl;   

  76.         ps.Add("IASID", ssoRequest.IASID);   

  77.         ps.Add("TimeStamp", ssoRequest.TimeStamp);   

  78.         ps.Add("AppUrl", ssoRequest.AppUrl);   

  79.         ps.Add("Authenticator", ssoRequest.Authenticator);   

  80.         ps.Add("Logout", "true");   

  81.         ps.Post();   

  82.     }   

  83. //返回主站 

  84. protectedvoid LinkButton1_Click(object sender, EventArgs e)   

  85.     {   

  86. if (Session["CurrUserName"] != null)   

  87.         {   

  88.             Response.Redirect("http://localhost/MasterSite/SiteList.aspx");   

  89.         }   

  90.     }   

  91. }  

[c-sharp] view plain copy print?

  1. using System;  

  2. using System.Data;  

  3. using System.Configuration;  

  4. using System.Web;  

  5. using System.Web.Security;  

  6. using System.Web.UI;  

  7. using System.Web.UI.WebControls;  

  8. using System.Web.UI.WebControls.WebParts;  

  9. using System.Web.UI.HtmlControls;  

  10. public partial class _Default : System.Web.UI.Page  

  11. {  

  12.     protectedvoid Page_Load(object sender, EventArgs e)  

  13.     {  

  14.         if (!IsPostBack)  

  15.         {  

  16.             #region SSO 部分代码

  17.             SSORequest ssoRequest = new SSORequest();  

  18.             if (string.IsNullOrEmpty(Request["IASID"]))  

  19.             {  

  20.                 ssoRequest.IASID = "02";  

  21.                 ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");  

  22.                 ssoRequest.AppUrl = Request.Url.ToString();  

  23.                 Authentication.CreateAppToken(ssoRequest);  

  24.                 Post(ssoRequest);  

  25.             }  

  26.             elseif (!string.IsNullOrEmpty(Request["IASID"])  

  27.                 && !string.IsNullOrEmpty(Request["TimeStamp"])  

  28.                 && !string.IsNullOrEmpty(Request["AppUrl"])  

  29.                 && !string.IsNullOrEmpty(Request["UserAccount"])  

  30.                 && !string.IsNullOrEmpty(Request["Authenticator"]))  

  31.             {  

  32.                 ssoRequest.IASID = Request["IASID"];  

  33.                 ssoRequest.TimeStamp = Request["TimeStamp"];  

  34.                 ssoRequest.AppUrl = Request["AppUrl"];  

  35.                 ssoRequest.UserAccount = Request["UserAccount"];  

  36.                 ssoRequest.Authenticator = Request["Authenticator"];  

  37.                 if (Authentication.ValidateEACToken(ssoRequest))  

  38.                 {  

  39.                     Session["CurrUserName"] = Request["UserAccount"];  

  40.                     Session.Timeout = 120;  

  41.                     FormsAuthentication.SetAuthCookie(Request["UserAccount"], false);  

  42.                     Response.Write(string.Format("{0},您好!欢迎来到site2,  >> 访问<a href="\" mce_href="\""http://localhost/Site1/Default.aspx\">site1</a>", ssoRequest.UserAccount));

  43.                 }  

  44.             }  

  45.             ViewState["SSORequest"] = ssoRequest;  

  46.             #endregion

  47.         }  

  48.     }  

  49.     void Post(SSORequest ssoRequest)  

  50.     {  

  51.         PostService ps = new PostService();  

  52.         //认证中心(主站)地址

  53.         string EACUrl = "http://localhost/MasterSite/Default.aspx";  

  54.         ps.Url = EACUrl;  

  55.         //ps.Add("UserAccount", ssoRequest.UserAccount);

  56.         ps.Add("IASID", ssoRequest.IASID);  

  57.         ps.Add("TimeStamp", ssoRequest.TimeStamp);  

  58.         ps.Add("AppUrl", ssoRequest.AppUrl);  

  59.         ps.Add("Authenticator", ssoRequest.Authenticator);  

  60.         ps.Post();  

  61.     }  

  62.     //注销登录

  63.     protectedvoid LinkButton2_Click(object sender, EventArgs e)  

  64.     {  

  65.         FormsAuthentication.SignOut();  

  66.         SSORequest ssoRequest = new SSORequest();  

  67.         ssoRequest.IASID = "02";  

  68.         ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm");  

  69.         ssoRequest.AppUrl = Request.Url.ToString();  

  70.         Authentication.CreateAppToken(ssoRequest);  

  71.         PostService ps = new PostService();  

  72.         //认证中心(主站)地址

  73.         string EACUrl = "http://localhost/MasterSite/Default.aspx";  

  74.         ps.Url = EACUrl;  

  75.         ps.Add("IASID", ssoRequest.IASID);  

  76.         ps.Add("TimeStamp", ssoRequest.TimeStamp);  

  77.         ps.Add("AppUrl", ssoRequest.AppUrl);  

  78.         ps.Add("Authenticator", ssoRequest.Authenticator);  

  79.         ps.Add("Logout", "true");  

  80.         ps.Post();  

  81.     }  

  82.     //返回主站

  83.     protectedvoid LinkButton1_Click(object sender, EventArgs e)  

  84.     {  

  85.         if (Session["CurrUserName"] != null)  

  86.         {  

  87.             Response.Redirect("http://localhost/MasterSite/SiteList.aspx");  

  88.         }  

  89.     }  

  90. }  

对于tokent请求,tokent验证,需要对它进行加密、解密。

其它代码:

Authentication.cs

  1. using System;   

  2. using System.Data;   

  3. using System.Configuration;   

  4. using System.Web;   

  5. using System.Web.Security;   

  6. using System.Collections.Generic;   

  7. using System.Text;   

  8. /// <summary> 

  9. /// 安全验证类 

  10. /// </summary> 

  11. publicclass Authentication   

  12. {   

  13. staticreadonlystring cookieName = "EACToken";   

  14. staticreadonlystring hashSplitter = "|";   

  15. public Authentication()   

  16.     {   

  17.     }   

  18. publicstaticstring GetAppKey(int appID)   

  19.     {   

  20. //string cmdText = @"select * from "; 

  21. returnstring.Empty;   

  22.     }   

  23. publicstaticstring GetAppKey()   

  24.     {   

  25. return"22362E7A9285DD53A0BBC2932F9733C505DC04EDBFE00D70";   

  26.     }   

  27. publicstaticstring GetAppIV()   

  28.     {   

  29. return"1E7FA9231E7FA923";   

  30.     }   

  31. /// <summary> 

  32. /// 取得加密服务 

  33. /// </summary> 

  34. /// <returns></returns> 

  35. static CryptoService GetCryptoService()   

  36.     {   

  37. string key = GetAppKey();   

  38. string IV = GetAppIV();   

  39.         CryptoService cs = new CryptoService(key, IV);   

  40. return cs;   

  41.     }   

  42. /// <summary> 

  43. /// 创建各分站发往认证中心的 Token 

  44. /// </summary> 

  45. /// <param name="ssoRequest"></param> 

  46. /// <returns></returns> 

  47. publicstaticbool CreateAppToken(SSORequest ssoRequest)   

  48.     {   

  49. string OriginalAuthenticator = ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;   

  50. string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);   

  51. string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;   

  52. byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);   

  53.         CryptoService cs = GetCryptoService();   

  54. byte[] encrypted;   

  55. if (cs.Encrypt(bToEncrypt, out encrypted))   

  56.         {   

  57.             ssoRequest.Authenticator = CryptoHelper.ToBase64String(encrypted);   

  58. returntrue;   

  59.         }   

  60. else

  61.         {   

  62. returnfalse;   

  63.         }   

  64.     }   

  65. /// <summary> 

  66. /// 验证从各分站发送过来的 Token 

  67. /// </summary> 

  68. /// <param name="ssoRequest"></param> 

  69. /// <returns></returns> 

  70. publicstaticbool ValidateAppToken(SSORequest ssoRequest)   

  71.     {   

  72. string Authenticator = ssoRequest.Authenticator;   

  73. string OriginalAuthenticator = ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;   

  74. string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);   

  75. string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;   

  76. byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);   

  77.         CryptoService cs = GetCryptoService();   

  78. byte[] encrypted;   

  79. if (cs.Encrypt(bToEncrypt, out encrypted))   

  80.         {   

  81. return Authenticator == CryptoHelper.ToBase64String(encrypted);   

  82.         }   

  83. else

  84.         {   

  85. returnfalse;   

  86.         }   

  87.     }   

  88. /// <summary> 

  89. /// 创建认证中心发往各分站的 Token 

  90. /// </summary> 

  91. /// <param name="ssoRequest"></param> 

  92. /// <returns></returns> 

  93. publicstaticbool CreateEACToken(SSORequest ssoRequest)   

  94.     {   

  95. string OriginalAuthenticator = ssoRequest.UserAccount + ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;   

  96. string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);   

  97. string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;   

  98. byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);   

  99.         CryptoService cs = GetCryptoService();   

  100. byte[] encrypted;   

  101. if (cs.Encrypt(bToEncrypt, out encrypted))   

  102.         {   

  103.             ssoRequest.Authenticator = CryptoHelper.ToBase64String(encrypted);   

  104. returntrue;   

  105.         }   

  106. else

  107.         {   

  108. returnfalse;   

  109.         }   

  110.     }   

  111. /// <summary> 

  112. /// 验证从认证中心发送过来的 Token 

  113. /// </summary> 

  114. /// <param name="ssoRequest"></param> 

  115. /// <returns></returns> 

  116. publicstaticbool ValidateEACToken(SSORequest ssoRequest)   

  117.     {   

  118. string Authenticator = ssoRequest.Authenticator;   

  119. string OriginalAuthenticator = ssoRequest.UserAccount + ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;   

  120. string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);   

  121. string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;   

  122. byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);   

  123. string EncryCurrentAuthenticator = string.Empty;   

  124.         CryptoService cs = GetCryptoService();   

  125. byte[] encrypted;   

  126. if (cs.Encrypt(bToEncrypt, out encrypted))   

  127.         {   

  128.             EncryCurrentAuthenticator = CryptoHelper.ToBase64String(encrypted);   

  129. return Authenticator == EncryCurrentAuthenticator;   

  130.         }   

  131. else

  132.         {   

  133. returnfalse;   

  134.         }   

  135.     }   

  136. /// <summary> 

  137. /// 创建 EAC 认证中心的 Cookie 

  138. /// </summary> 

  139. /// <param name="userAccount"></param> 

  140. /// <param name="timeStamp"></param> 

  141. /// <param name="expireTime"></param> 

  142. /// <param name="cookieValue"></param> 

  143. /// <returns></returns> 

  144. publicstaticbool CreatEACCookie(string userAccount, string timeStamp, string expireTime)   

  145.     {   

  146. string plainText = "UserAccount=" + userAccount + ";TimeStamp=" + timeStamp + ";ExpireTime=" + expireTime;   

  147.         plainText += hashSplitter + CryptoHelper.ComputeHashString(plainText);   

  148.         CryptoService cs = GetCryptoService();   

  149. byte[] encrypted;   

  150. if (cs.Encrypt(CryptoHelper.ConvertStringToByteArray(plainText), out encrypted))   

  151.         {   

  152. string cookieValue = CryptoHelper.ToBase64String(encrypted);   

  153.             SetCookie(cookieValue);   

  154. returntrue;   

  155.         }   

  156. else

  157.         {   

  158. returnfalse;   

  159.         }   

  160.     }   

  161. /// <summary> 

  162. /// 验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号 

  163. /// </summary> 

  164. /// <param name="userAccount">输出用户登录账号</param> 

  165. /// <returns></returns> 

  166. publicstaticbool ValidateEACCookie(outstring userAccount)   

  167.     {   

  168.         userAccount = string.Empty;   

  169. try

  170.         {   

  171. string cookieValue = GetCookie().Value;   

  172. byte[] toDecrypt = CryptoHelper.FromBase64String(cookieValue);   

  173.             CryptoService cs = GetCryptoService();   

  174. string decrypted = string.Empty;   

  175. if (cs.Decrypt(toDecrypt, out decrypted))   

  176.             {   

  177. string[] arrTemp = decrypted.Split(Convert.ToChar(hashSplitter));   

  178. string plainText = arrTemp[0];   

  179. string hashedText = arrTemp[1];   

  180.                 userAccount = plainText.Split(Convert.ToChar(";"))[0].Split(Convert.ToChar("="))[1];   

  181. return hashedText.Replace("\0", string.Empty) == CryptoHelper.ComputeHashString(plainText);   

  182.             }   

  183. else

  184.             {   

  185. returnfalse;   

  186.             }   

  187.         }   

  188. catch (Exception e)   

  189.         {   

  190. returnfalse;   

  191.         }   

  192.     }   

  193. publicstaticvoid Logout()   

  194.     {   

  195.         HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Parse("1900-1-1");   

  196.         HttpContext.Current.Response.Cookies[cookieName].Path = "/";   

  197.     }   

  198. privatestaticvoid SetCookie(string cookieValue)   

  199.     {   

  200.         HttpContext.Current.Response.Cookies[cookieName].Value = cookieValue;   

  201.         HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Now.AddHours(24);   

  202.         HttpContext.Current.Response.Cookies[cookieName].Path = "/";   

  203.     }   

  204. privatestatic HttpCookie GetCookie()   

  205.     {   

  206.         HttpCookie cookie = HttpContext.Current.Request.Cookies["EACToken"];   

  207. return cookie;   

  208.     }   

  209. }  





  1. using System;  

  2. using System.Data;  

  3. using System.Configuration;  

  4. using System.Web;  

  5. using System.Web.Security;  

  6. using System.Collections.Generic;  

  7. using System.Text;  

  8. /// <summary>

  9. /// 安全验证类

  10. /// </summary>

  11. publicclass Authentication  

  12. {  

  13.     staticreadonlystring cookieName = "EACToken";  

  14.     staticreadonlystring hashSplitter = "|";  

  15.     public Authentication()  

  16.     {  

  17.     }  

  18.     publicstaticstring GetAppKey(int appID)  

  19.     {  

  20.         //string cmdText = @"select * from ";

  21.         returnstring.Empty;  

  22.     }  

  23.     publicstaticstring GetAppKey()  

  24.     {  

  25.         return"22362E7A9285DD53A0BBC2932F9733C505DC04EDBFE00D70";  

  26.     }  

  27.     publicstaticstring GetAppIV()  

  28.     {  

  29.         return"1E7FA9231E7FA923";  

  30.     }  

  31.     /// <summary>

  32.     /// 取得加密服务

  33.     /// </summary>

  34.     /// <returns></returns>

  35.     static CryptoService GetCryptoService()  

  36.     {  

  37.         string key = GetAppKey();  

  38.         string IV = GetAppIV();  

  39.         CryptoService cs = new CryptoService(key, IV);  

  40.         return cs;  

  41.     }  

  42.     /// <summary>

  43.     /// 创建各分站发往认证中心的 Token

  44.     /// </summary>

  45.     /// <param name="ssoRequest"></param>

  46.     /// <returns></returns>

  47.     publicstaticbool CreateAppToken(SSORequest ssoRequest)  

  48.     {  

  49.         string OriginalAuthenticator = ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;  

  50.         string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);  

  51.         string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;  

  52.         byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);  

  53.         CryptoService cs = GetCryptoService();  

  54.         byte[] encrypted;  

  55.         if (cs.Encrypt(bToEncrypt, out encrypted))  

  56.         {  

  57.             ssoRequest.Authenticator = CryptoHelper.ToBase64String(encrypted);  

  58.             returntrue;  

  59.         }  

  60.         else

  61.         {  

  62.             returnfalse;  

  63.         }  

  64.     }  

  65.     /// <summary>

  66.     /// 验证从各分站发送过来的 Token

  67.     /// </summary>

  68.     /// <param name="ssoRequest"></param>

  69.     /// <returns></returns>

  70.     publicstaticbool ValidateAppToken(SSORequest ssoRequest)  

  71.     {  

  72.         string Authenticator = ssoRequest.Authenticator;  

  73.         string OriginalAuthenticator = ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;  

  74.         string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);  

  75.         string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;  

  76.         byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);  

  77.         CryptoService cs = GetCryptoService();  

  78.         byte[] encrypted;  

  79.         if (cs.Encrypt(bToEncrypt, out encrypted))  

  80.         {  

  81.             return Authenticator == CryptoHelper.ToBase64String(encrypted);  

  82.         }  

  83.         else

  84.         {  

  85.             returnfalse;  

  86.         }  

  87.     }  

  88.     /// <summary>

  89.     /// 创建认证中心发往各分站的 Token

  90.     /// </summary>

  91.     /// <param name="ssoRequest"></param>

  92.     /// <returns></returns>

  93.     publicstaticbool CreateEACToken(SSORequest ssoRequest)  

  94.     {  

  95.         string OriginalAuthenticator = ssoRequest.UserAccount + ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;  

  96.         string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);  

  97.         string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;  

  98.         byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);  

  99.         CryptoService cs = GetCryptoService();  

  100.         byte[] encrypted;  

  101.         if (cs.Encrypt(bToEncrypt, out encrypted))  

  102.         {  

  103.             ssoRequest.Authenticator = CryptoHelper.ToBase64String(encrypted);  

  104.             returntrue;  

  105.         }  

  106.         else

  107.         {  

  108.             returnfalse;  

  109.         }  

  110.     }  

  111.     /// <summary>

  112.     /// 验证从认证中心发送过来的 Token

  113.     /// </summary>

  114.     /// <param name="ssoRequest"></param>

  115.     /// <returns></returns>

  116.     publicstaticbool ValidateEACToken(SSORequest ssoRequest)  

  117.     {  

  118.         string Authenticator = ssoRequest.Authenticator;  

  119.         string OriginalAuthenticator = ssoRequest.UserAccount + ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;  

  120.         string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);  

  121.         string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;  

  122.         byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);  

  123.         string EncryCurrentAuthenticator = string.Empty;  

  124.         CryptoService cs = GetCryptoService();  

  125.         byte[] encrypted;  

  126.         if (cs.Encrypt(bToEncrypt, out encrypted))  

  127.         {  

  128.             EncryCurrentAuthenticator = CryptoHelper.ToBase64String(encrypted);  

  129.             return Authenticator == EncryCurrentAuthenticator;  

  130.         }  

  131.         else

  132.         {  

  133.             returnfalse;  

  134.         }  

  135.     }  

  136.     /// <summary>

  137.     /// 创建 EAC 认证中心的 Cookie

  138.     /// </summary>

  139.     /// <param name="userAccount"></param>

  140.     /// <param name="timeStamp"></param>

  141.     /// <param name="expireTime"></param>

  142.     /// <param name="cookieValue"></param>

  143.     /// <returns></returns>

  144.     publicstaticbool CreatEACCookie(string userAccount, string timeStamp, string expireTime)  

  145.     {  

  146.         string plainText = "UserAccount=" + userAccount + ";TimeStamp=" + timeStamp + ";ExpireTime=" + expireTime;  

  147.         plainText += hashSplitter + CryptoHelper.ComputeHashString(plainText);  

  148.         CryptoService cs = GetCryptoService();  

  149.         byte[] encrypted;  

  150.         if (cs.Encrypt(CryptoHelper.ConvertStringToByteArray(plainText), out encrypted))  

  151.         {  

  152.             string cookieValue = CryptoHelper.ToBase64String(encrypted);  

  153.             SetCookie(cookieValue);  

  154.             returntrue;  

  155.         }  

  156.         else

  157.         {  

  158.             returnfalse;  

  159.         }  

  160.     }  

  161.     /// <summary>

  162.     /// 验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号

  163.     /// </summary>

  164.     /// <param name="userAccount">输出用户登录账号</param>

  165.     /// <returns></returns>

  166.     publicstaticbool ValidateEACCookie(outstring userAccount)  

  167.     {  

  168.         userAccount = string.Empty;  

  169.         try

  170.         {  

  171.             string cookieValue = GetCookie().Value;  

  172.             byte[] toDecrypt = CryptoHelper.FromBase64String(cookieValue);  

  173.             CryptoService cs = GetCryptoService();  

  174.             string decrypted = string.Empty;  

  175.             if (cs.Decrypt(toDecrypt, out decrypted))  

  176.             {  

  177.                 string[] arrTemp = decrypted.Split(Convert.ToChar(hashSplitter));  

  178.                 string plainText = arrTemp[0];  

  179.                 string hashedText = arrTemp[1];  

  180.                 userAccount = plainText.Split(Convert.ToChar(";"))[0].Split(Convert.ToChar("="))[1];  

  181.                 return hashedText.Replace("\0", string.Empty) == CryptoHelper.ComputeHashString(plainText);  

  182.             }  

  183.             else

  184.             {  

  185.                 returnfalse;  

  186.             }  

  187.         }  

  188.         catch (Exception e)  

  189.         {  

  190.             returnfalse;  

  191.         }  

  192.     }  

  193.     publicstaticvoid Logout()  

  194.     {  

  195.         HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Parse("1900-1-1");  

  196.         HttpContext.Current.Response.Cookies[cookieName].Path = "/";  

  197.     }  

  198.     privatestaticvoid SetCookie(string cookieValue)  

  199.     {  

  200.         HttpContext.Current.Response.Cookies[cookieName].Value = cookieValue;  

  201.         HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Now.AddHours(24);  

  202.         HttpContext.Current.Response.Cookies[cookieName].Path = "/";  

  203.     }  

  204.     privatestatic HttpCookie GetCookie()  

  205.     {  

  206.         HttpCookie cookie = HttpContext.Current.Request.Cookies["EACToken"];  

  207.         return cookie;  

  208.     }  

  209. }  


CryptoHelper.cs

  1. using System;   

  2. using System.Collections.Generic;   

  3. using System.Text;   

  4. using System.Security.Cryptography;   

  5. publicclass CryptoHelper   

  6. {   

  7. /// <summary> 

  8. /// 复合 Hash:string --> byte[] --> hashed byte[] --> base64 string 

  9. /// </summary> 

  10. /// <param name="s"></param> 

  11. /// <returns></returns> 

  12. publicstaticstring ComputeHashString(string s)   

  13.     {   

  14. return ToBase64String(ComputeHash(ConvertStringToByteArray(s)));   

  15.     }   

  16. publicstaticbyte[] ComputeHash(byte[] buf)   

  17.     {   

  18. //return ((HashAlgorithm)CryptoConfig.CreateFromName("SHA1")).ComputeHash(buf); 

  19. return SHA1.Create().ComputeHash(buf);   

  20.     }   

  21. /// <summary> 

  22. /// //System.Convert.ToBase64String 

  23. /// </summary> 

  24. /// <param name="buf"></param> 

  25. /// <returns></returns> 

  26. publicstaticstring ToBase64String(byte[] buf)   

  27.     {   

  28. return System.Convert.ToBase64String(buf);   

  29.     }   

  30. publicstaticbyte[] FromBase64String(string s)   

  31.     {   

  32. return System.Convert.FromBase64String(s);   

  33.     }   

  34. /// <summary> 

  35. /// //Encoding.UTF8.GetBytes(s) 

  36. /// </summary> 

  37. /// <param name="s"></param> 

  38. /// <returns></returns> 

  39. publicstaticbyte[] ConvertStringToByteArray(String s)   

  40.     {   

  41. return Encoding.UTF8.GetBytes(s);//gb2312 

  42.     }   

  43. publicstaticstring ConvertByteArrayToString(byte[] buf)   

  44.     {   

  45. //return System.Text.Encoding.GetEncoding("utf-8").GetString(buf); 

  46. return Encoding.UTF8.GetString(buf);   

  47.     }   

  48. /// <summary> 

  49. /// 字节数组转换为十六进制字符串 

  50. /// </summary> 

  51. /// <param name="buf"></param> 

  52. /// <returns></returns> 

  53. publicstaticstring ByteArrayToHexString(byte[] buf)   

  54.     {   

  55.         StringBuilder sb = new StringBuilder();   

  56. for (int i = 0; i < buf.Length; i++)   

  57.         {   

  58.             sb.Append(buf[i].ToString("X").Length == 2 ? buf[i].ToString("X") : "0" + buf[i].ToString("X"));   

  59.         }   

  60. return sb.ToString();   

  61.     }   

  62. /// <summary> 

  63. /// 十六进制字符串转换为字节数组 

  64. /// </summary> 

  65. /// <param name="s"></param> 

  66. /// <returns></returns> 

  67. publicstaticbyte[] HexStringToByteArray(string s)   

  68.     {   

  69.         Byte[] buf = newbyte[s.Length / 2];   

  70. for (int i = 0; i < buf.Length; i++)   

  71.         {   

  72.             buf[i] = (byte)(Char2Hex(s.Substring(i * 2, 1)) * 0x10 + Char2Hex(s.Substring(i * 2 + 1, 1)));   

  73.         }   

  74. return buf;   

  75.     }   

  76. privatestaticbyte Char2Hex(string chr)   

  77.     {   

  78. switch (chr)   

  79.         {   

  80. case"0":   

  81. return 0x00;   

  82. case"1":   

  83. return 0x01;   

  84. case"2":   

  85. return 0x02;   

  86. case"3":   

  87. return 0x03;   

  88. case"4":   

  89. return 0x04;   

  90. case"5":   

  91. return 0x05;   

  92. case"6":   

  93. return 0x06;   

  94. case"7":   

  95. return 0x07;   

  96. case"8":   

  97. return 0x08;   

  98. case"9":   

  99. return 0x09;   

  100. case"A":   

  101. return 0x0a;   

  102. case"B":   

  103. return 0x0b;   

  104. case"C":   

  105. return 0x0c;   

  106. case"D":   

  107. return 0x0d;   

  108. case"E":   

  109. return 0x0e;   

  110. case"F":   

  111. return 0x0f;   

  112.         }   

  113. return 0x00;   

  114.     }   

  115. }  

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4. using System.Security.Cryptography;  

  5. publicclass CryptoHelper  

  6. {  

  7.     /// <summary>

  8.     /// 复合 Hash:string --> byte[] --> hashed byte[] --> base64 string

  9.     /// </summary>

  10.     /// <param name="s"></param>

  11.     /// <returns></returns>

  12.     publicstaticstring ComputeHashString(string s)  

  13.     {  

  14.         return ToBase64String(ComputeHash(ConvertStringToByteArray(s)));  

  15.     }  

  16.     publicstaticbyte[] ComputeHash(byte[] buf)  

  17.     {  

  18.         //return ((HashAlgorithm)CryptoConfig.CreateFromName("SHA1")).ComputeHash(buf);

  19.         return SHA1.Create().ComputeHash(buf);  

  20.     }  

  21.     /// <summary>

  22.     /// //System.Convert.ToBase64String

  23.     /// </summary>

  24.     /// <param name="buf"></param>

  25.     /// <returns></returns>

  26.     publicstaticstring ToBase64String(byte[] buf)  

  27.     {  

  28.         return System.Convert.ToBase64String(buf);  

  29.     }  

  30.     publicstaticbyte[] FromBase64String(string s)  

  31.     {  

  32.         return System.Convert.FromBase64String(s);  

  33.     }  

  34.     /// <summary>

  35.     /// //Encoding.UTF8.GetBytes(s)

  36.     /// </summary>

  37.     /// <param name="s"></param>

  38.     /// <returns></returns>

  39.     publicstaticbyte[] ConvertStringToByteArray(String s)  

  40.     {  

  41.         return Encoding.UTF8.GetBytes(s);//gb2312

  42.     }  

  43.     publicstaticstring ConvertByteArrayToString(byte[] buf)  

  44.     {  

  45.         //return System.Text.Encoding.GetEncoding("utf-8").GetString(buf);

  46.         return Encoding.UTF8.GetString(buf);  

  47.     }  

  48.     /// <summary>

  49.     /// 字节数组转换为十六进制字符串

  50.     /// </summary>

  51.     /// <param name="buf"></param>

  52.     /// <returns></returns>

  53.     publicstaticstring ByteArrayToHexString(byte[] buf)  

  54.     {  

  55.         StringBuilder sb = new StringBuilder();  

  56.         for (int i = 0; i < buf.Length; i++)  

  57.         {  

  58.             sb.Append(buf[i].ToString("X").Length == 2 ? buf[i].ToString("X") : "0" + buf[i].ToString("X"));  

  59.         }  

  60.         return sb.ToString();  

  61.     }  

  62.     /// <summary>

  63.     /// 十六进制字符串转换为字节数组

  64.     /// </summary>

  65.     /// <param name="s"></param>

  66.     /// <returns></returns>

  67.     publicstaticbyte[] HexStringToByteArray(string s)  

  68.     {  

  69.         Byte[] buf = newbyte[s.Length / 2];  

  70.         for (int i = 0; i < buf.Length; i++)  

  71.         {  

  72.             buf[i] = (byte)(Char2Hex(s.Substring(i * 2, 1)) * 0x10 + Char2Hex(s.Substring(i * 2 + 1, 1)));  

  73.         }  

  74.         return buf;  

  75.     }  

  76.     privatestaticbyte Char2Hex(string chr)  

  77.     {  

  78.         switch (chr)  

  79.         {  

  80.             case"0":  

  81.                 return 0x00;  

  82.             case"1":  

  83.                 return 0x01;  

  84.             case"2":  

  85.                 return 0x02;  

  86.             case"3":  

  87.                 return 0x03;  

  88.             case"4":  

  89.                 return 0x04;  

  90.             case"5":  

  91.                 return 0x05;  

  92.             case"6":  

  93.                 return 0x06;  

  94.             case"7":  

  95.                 return 0x07;  

  96.             case"8":  

  97.                 return 0x08;  

  98.             case"9":  

  99.                 return 0x09;  

  100.             case"A":  

  101.                 return 0x0a;  

  102.             case"B":  

  103.                 return 0x0b;  

  104.             case"C":  

  105.                 return 0x0c;  

  106.             case"D":  

  107.                 return 0x0d;  

  108.             case"E":  

  109.                 return 0x0e;  

  110.             case"F":  

  111.                 return 0x0f;  

  112.         }  

  113.         return 0x00;  

  114.     }  

  115. }  

CryptoService.cs

  1. using System;   

  2. using System.Data;   

  3. using System.Configuration;   

  4. using System.Web;   

  5. using System.Web.Security;   

  6. using System.Web.UI;   

  7. using System.Web.UI.WebControls;   

  8. using System.Web.UI.WebControls.WebParts;   

  9. using System.Web.UI.HtmlControls;   

  10. using System.Text;   

  11. using System.Security.Cryptography;   

  12. using System.IO;   

  13. publicclass CryptoService   

  14. {   

  15. /// <summary> 

  16. /// 加密的密钥 

  17. /// </summary> 

  18. string sKey = "22362E7A9285DD53A0BBC2932F9733C505DC04EDBFE00D70";   

  19. string sIV = "1E7FA9231E7FA923";   

  20. byte[] byteKey;   

  21. byte[] byteIV;   

  22. /// <summary> 

  23. /// 加密向量 

  24. /// </summary> 

  25. staticbyte[] bIV ={ 1, 2, 3, 4, 5, 6, 7, 8 };   

  26. public CryptoService()   

  27.     { }   

  28. public CryptoService(string key, string IV)   

  29.     {   

  30.         sKey = key;   

  31.         sIV = IV;   

  32.         byteKey = CryptoHelper.HexStringToByteArray(sKey);   

  33.         byteIV = CryptoHelper.HexStringToByteArray(sIV);   

  34.     }   

  35. /// <summary> 

  36. /// 将明文加密,返回密文 

  37. /// </summary> 

  38. /// <param name="Data">要加密的字串</param> 

  39. /// <returns></returns> 

  40. publicbyte[] Encrypt(string Data)   

  41.     {   

  42. try

  43.         {   

  44. byte[] ret;   

  45. using (MemoryStream mStream = new MemoryStream())   

  46. using (CryptoStream cStream = new CryptoStream(mStream,   

  47. new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),   

  48.                 CryptoStreamMode.Write))   

  49.             {   

  50. byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);   

  51. // Write the byte array to the crypto stream and flush it. 

  52.                 cStream.Write(toEncrypt, 0, toEncrypt.Length);   

  53.                 cStream.FlushFinalBlock();   

  54. // Get an array of bytes from the  

  55. // MemoryStream that holds the  

  56. // encrypted data. 

  57.                 ret = mStream.ToArray();   

  58.             }   

  59. return ret;   

  60.         }   

  61. catch (CryptographicException e)   

  62.         {   

  63. //Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 

  64. returnnull;   

  65.         }   

  66.     }   

  67. /// <summary> 

  68. /// 将明文加密,返回密文 

  69. /// </summary> 

  70. /// <param name="toEncrypt">明文</param> 

  71. /// <param name="encrypted">密文</param> 

  72. /// <returns></returns> 

  73. publicbool Encrypt(byte[] toEncrypt, outbyte[] encrypted)   

  74.     {   

  75.         encrypted = null;   

  76. try

  77.         {   

  78. // Create a new MemoryStream using the passed  

  79. // array of encrypted data. 

  80. // Create a CryptoStream using the MemoryStream  

  81. // and the passed key and initialization vector (IV). 

  82. using (MemoryStream mStream = new MemoryStream())   

  83. using (CryptoStream cStream = new CryptoStream(mStream,   

  84. new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),   

  85.                 CryptoStreamMode.Write))   

  86.             {   

  87. // Write the byte array to the crypto stream and flush it. 

  88.                 cStream.Write(toEncrypt, 0, toEncrypt.Length);   

  89.                 cStream.FlushFinalBlock();   

  90. // Get an array of bytes from the  

  91. // MemoryStream that holds the  

  92. // encrypted data. 

  93.                 encrypted = mStream.ToArray();   

  94.             }   

  95. returntrue;   

  96.         }   

  97. catch (CryptographicException e)   

  98.         {   

  99. //Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 

  100. returnfalse;   

  101.         }   

  102.     }   

  103. /// <summary> 

  104. /// 将明文加密,返回 Base64 字符串 

  105. /// </summary> 

  106. /// <param name="Data"></param> 

  107. /// <returns></returns> 

  108. publicstring EncryptToString(string Data)   

  109.     {   

  110. try

  111.         {   

  112. string base64String = string.Empty;   

  113. using (MemoryStream mStream = new MemoryStream())   

  114. using (CryptoStream cStream = new CryptoStream(mStream,   

  115. new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),   

  116.                 CryptoStreamMode.Write))   

  117.             {   

  118. byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);   

  119.                 cStream.Write(toEncrypt, 0, toEncrypt.Length);   

  120.                 cStream.FlushFinalBlock();   

  121. byte[] ret = mStream.ToArray();   

  122.                 base64String = Convert.ToBase64String(ret);   

  123.             }   

  124. return base64String;   

  125.         }   

  126. catch (CryptographicException e)   

  127.         {   

  128. returnnull;   

  129.         }   

  130.     }   

  131. /// <summary> 

  132. /// 将密文解密,返回明文 

  133. /// </summary> 

  134. /// <param name="Data">密文</param> 

  135. /// <returns>明文</returns> 

  136. publicbool Decrypt(byte[] Data, outstring decrypted)   

  137.     {   

  138.         decrypted = string.Empty;   

  139. try

  140.         {   

  141. using (MemoryStream msDecrypt = new MemoryStream(Data))   

  142. using (CryptoStream csDecrypt = new CryptoStream(msDecrypt,   

  143. new TripleDESCryptoServiceProvider().CreateDecryptor(byteKey, byteIV),   

  144.                 CryptoStreamMode.Read))   

  145.             {   

  146. byte[] fromEncrypt = newbyte[Data.Length];   

  147. // Read the decrypted data out of the crypto stream 

  148. // and place it into the temporary buffer. 

  149.                 csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);   

  150.                 decrypted = Encoding.UTF8.GetString(fromEncrypt);//new ASCIIEncoding().GetString(fromEncrypt);

  151. returntrue;   

  152.             }   

  153.         }   

  154. catch (CryptographicException e)   

  155.         {   

  156. returnfalse;   

  157.         }   

  158.     }   

  159. }  

[c-sharp] view plain copy print?

  1. using System;  

  2. using System.Data;  

  3. using System.Configuration;  

  4. using System.Web;  

  5. using System.Web.Security;  

  6. using System.Web.UI;  

  7. using System.Web.UI.WebControls;  

  8. using System.Web.UI.WebControls.WebParts;  

  9. using System.Web.UI.HtmlControls;  

  10. using System.Text;  

  11. using System.Security.Cryptography;  

  12. using System.IO;  

  13. publicclass CryptoService  

  14. {  

  15.     /// <summary>

  16.     /// 加密的密钥

  17.     /// </summary>

  18.     string sKey = "22362E7A9285DD53A0BBC2932F9733C505DC04EDBFE00D70";  

  19.     string sIV = "1E7FA9231E7FA923";  

  20.     byte[] byteKey;  

  21.     byte[] byteIV;  

  22.     /// <summary>

  23.     /// 加密向量

  24.     /// </summary>

  25.     staticbyte[] bIV ={ 1, 2, 3, 4, 5, 6, 7, 8 };  

  26.     public CryptoService()  

  27.     { }  

  28.     public CryptoService(string key, string IV)  

  29.     {  

  30.         sKey = key;  

  31.         sIV = IV;  

  32.         byteKey = CryptoHelper.HexStringToByteArray(sKey);  

  33.         byteIV = CryptoHelper.HexStringToByteArray(sIV);  

  34.     }  

  35.     /// <summary>

  36.     /// 将明文加密,返回密文

  37.     /// </summary>

  38.     /// <param name="Data">要加密的字串</param>

  39.     /// <returns></returns>

  40.     publicbyte[] Encrypt(string Data)  

  41.     {  

  42.         try

  43.         {  

  44.             byte[] ret;  

  45.             using (MemoryStream mStream = new MemoryStream())  

  46.             using (CryptoStream cStream = new CryptoStream(mStream,  

  47.                 new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),  

  48.                 CryptoStreamMode.Write))  

  49.             {  

  50.                 byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);  

  51.                 // Write the byte array to the crypto stream and flush it.

  52.                 cStream.Write(toEncrypt, 0, toEncrypt.Length);  

  53.                 cStream.FlushFinalBlock();  

  54.                 // Get an array of bytes from the 

  55.                 // MemoryStream that holds the 

  56.                 // encrypted data.

  57.                 ret = mStream.ToArray();  

  58.             }  

  59.             return ret;  

  60.         }  

  61.         catch (CryptographicException e)  

  62.         {  

  63.             //Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);

  64.             returnnull;  

  65.         }  

  66.     }  

  67.     /// <summary>

  68.     /// 将明文加密,返回密文

  69.     /// </summary>

  70.     /// <param name="toEncrypt">明文</param>

  71.     /// <param name="encrypted">密文</param>

  72.     /// <returns></returns>

  73.     publicbool Encrypt(byte[] toEncrypt, outbyte[] encrypted)  

  74.     {  

  75.         encrypted = null;  

  76.         try

  77.         {  

  78.             // Create a new MemoryStream using the passed 

  79.             // array of encrypted data.

  80.             // Create a CryptoStream using the MemoryStream 

  81.             // and the passed key and initialization vector (IV).

  82.             using (MemoryStream mStream = new MemoryStream())  

  83.             using (CryptoStream cStream = new CryptoStream(mStream,  

  84.                 new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),  

  85.                 CryptoStreamMode.Write))  

  86.             {  

  87.                 // Write the byte array to the crypto stream and flush it.

  88.                 cStream.Write(toEncrypt, 0, toEncrypt.Length);  

  89.                 cStream.FlushFinalBlock();  

  90.                 // Get an array of bytes from the 

  91.                 // MemoryStream that holds the 

  92.                 // encrypted data.

  93.                 encrypted = mStream.ToArray();  

  94.             }  

  95.             returntrue;  

  96.         }  

  97.         catch (CryptographicException e)  

  98.         {  

  99.             //Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);

  100.             returnfalse;  

  101.         }  

  102.     }  

  103.     /// <summary>

  104.     /// 将明文加密,返回 Base64 字符串

  105.     /// </summary>

  106.     /// <param name="Data"></param>

  107.     /// <returns></returns>

  108.     publicstring EncryptToString(string Data)  

  109.     {  

  110.         try

  111.         {  

  112.             string base64String = string.Empty;  

  113.             using (MemoryStream mStream = new MemoryStream())  

  114.             using (CryptoStream cStream = new CryptoStream(mStream,  

  115.                 new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),  

  116.                 CryptoStreamMode.Write))  

  117.             {  

  118.                 byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);  

  119.                 cStream.Write(toEncrypt, 0, toEncrypt.Length);  

  120.                 cStream.FlushFinalBlock();  

  121.                 byte[] ret = mStream.ToArray();  

  122.                 base64String = Convert.ToBase64String(ret);  

  123.             }  

  124.             return base64String;  

  125.         }  

  126.         catch (CryptographicException e)  

  127.         {  

  128.             returnnull;  

  129.         }  

  130.     }  

  131.     /// <summary>

  132.     /// 将密文解密,返回明文

  133.     /// </summary>

  134.     /// <param name="Data">密文</param>

  135.     /// <returns>明文</returns>

  136.     publicbool Decrypt(byte[] Data, outstring decrypted)  

  137.     {  

  138.         decrypted = string.Empty;  

  139.         try

  140.         {  

  141.             using (MemoryStream msDecrypt = new MemoryStream(Data))  

  142.             using (CryptoStream csDecrypt = new CryptoStream(msDecrypt,  

  143.                 new TripleDESCryptoServiceProvider().CreateDecryptor(byteKey, byteIV),  

  144.                 CryptoStreamMode.Read))  

  145.             {  

  146.                 byte[] fromEncrypt = newbyte[Data.Length];  

  147.                 // Read the decrypted data out of the crypto stream

  148.                 // and place it into the temporary buffer.

  149.                 csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);  

  150.                 decrypted = Encoding.UTF8.GetString(fromEncrypt);//new ASCIIEncoding().GetString(fromEncrypt);

  151.                 returntrue;  

  152.             }  

  153.         }  

  154.         catch (CryptographicException e)  

  155.         {  

  156.             returnfalse;  

  157.         }  

  158.     }  

  159. }  

PostService.cs

  1. using System;   

  2. using System.Collections.Generic;   

  3. using System.Text;   

  4. publicclass PostService   

  5. {   

  6. private System.Collections.Specialized.NameValueCollection Inputs = new System.Collections.Specialized.NameValueCollection();   

  7. publicstring Url = "";   

  8. publicstring Method = "post";   

  9. publicstring FormName = "form1";   

  10. /// <summary> 

  11. /// 添加需要提交的名和值 

  12. /// </summary> 

  13. /// <param name="name"></param> 

  14. /// <param name="value"></param> 

  15. publicvoid Add(string name, string value)   

  16.     {   

  17.         Inputs.Add(name, value);   

  18.     }   

  19. /// <summary> 

  20. /// 以输出Html方式POST 

  21. /// </summary> 

  22. publicvoid Post()   

  23.     {   

  24.         System.Web.HttpContext.Current.Response.Clear();   

  25. string html = string.Empty;   

  26.         html += ("<html><head>");   

  27.         html += (string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));   

  28.         html += (string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));   

  29. try

  30.         {   

  31. for (int i = 0; i < Inputs.Keys.Count; i++)   

  32.             {   

  33.                 html += (string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", Inputs.Keys[i], Inputs[Inputs.Keys[i]]));   

  34.             }   

  35.             html += ("</form>");   

  36.             html += ("</body></html>");   

  37.             System.Web.HttpContext.Current.Response.Write(html);   

  38.             System.Web.HttpContext.Current.Response.End();   

  39.         }   

  40. catch (Exception ee)   

  41.         {   

  42. // 

  43.         }   

  44.     }   

  45. }  

[c-sharp] view plain copy print?

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4. publicclass PostService  

  5. {  

  6.     private System.Collections.Specialized.NameValueCollection Inputs = new System.Collections.Specialized.NameValueCollection();  

  7.     publicstring Url = "";  

  8.     publicstring Method = "post";  

  9.     publicstring FormName = "form1";  

  10.     /// <summary>

  11.     /// 添加需要提交的名和值

  12.     /// </summary>

  13.     /// <param name="name"></param>

  14.     /// <param name="value"></param>

  15.     publicvoid Add(string name, string value)  

  16.     {  

  17.         Inputs.Add(name, value);  

  18.     }  

  19.     /// <summary>

  20.     /// 以输出Html方式POST

  21.     /// </summary>

  22.     publicvoid Post()  

  23.     {  

  24.         System.Web.HttpContext.Current.Response.Clear();  

  25.         string html = string.Empty;  

  26.         html += ("<html><head>");  

  27.         html += (string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));  

  28.         html += (string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));  

  29.         try

  30.         {  

  31.             for (int i = 0; i < Inputs.Keys.Count; i++)  

  32.             {  

  33.                 html += (string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", Inputs.Keys[i], Inputs[Inputs.Keys[i]]));  

  34.             }  

  35.             html += ("</form>");  

  36.             html += ("</body></html>");  

  37.             System.Web.HttpContext.Current.Response.Write(html);  

  38.             System.Web.HttpContext.Current.Response.End();  

  39.         }  

  40.         catch (Exception ee)  

  41.         {  

  42.             //

  43.         }  

  44.     }  

  45. }  

SSORequest.cs

  1. using System;   

  2. using System.Data;   

  3. using System.Configuration;   

  4. using System.Web;   

  5. using System.Web.Security;   

  6. using System.Web.UI;   

  7. using System.Web.UI.WebControls;   

  8. using System.Web.UI.WebControls.WebParts;   

  9. using System.Web.UI.HtmlControls;   

  10. [Serializable]   

  11. publicclass SSORequest : MarshalByRefObject   

  12. {   

  13. publicstring IASID;         //各独立站点标识ID 

  14. publicstring TimeStamp;     //时间戳 

  15. publicstring AppUrl;        //各独立站点的访问地址 

  16. publicstring Authenticator; //各独立站点的 Token 

  17. publicstring UserAccount;   //账号 

  18. publicstring Password;      //密码 

  19. publicstring IPAddress;     //IP地址 

  20. //为ssresponse对象做准备 

  21. publicstring ErrorDescription = "认证失败";   //用户认证通过,认证失败,包数据格式不正确,数据校验不正确 

  22. publicint Result = -1;   

  23. public SSORequest()   

  24.     {   

  25.     }   

  26. /// <summary> 

  27. /// 获取当前页面上的SSORequest对象 

  28. /// </summary> 

  29. /// <param name="CurrentPage"></param> 

  30. /// <returns></returns> 

  31. publicstatic SSORequest GetRequest(Page CurrentPage)   

  32.     {   

  33.         SSORequest request = new SSORequest();   

  34.         request.IPAddress = CurrentPage.Request.UserHostAddress;   

  35.         request.IASID = CurrentPage.Request["IASID"].ToString();// Request本身会Decode 

  36.         request.UserAccount = CurrentPage.Request["UserAccount"].ToString();//this.Text 

  37.         request.Password = CurrentPage.Request["Password"].ToString();   

  38.         request.AppUrl = CurrentPage.Request["AppUrl"].ToString();   

  39.         request.Authenticator = CurrentPage.Request["Authenticator"].ToString();   

  40.         request.TimeStamp = CurrentPage.Request["TimeStamp"].ToString();   

  41. return request;   

  42.     }   

  43. }  

[c-sharp] view plain copy print?

  1. using System;  

  2. using System.Data;  

  3. using System.Configuration;  

  4. using System.Web;  

  5. using System.Web.Security;  

  6. using System.Web.UI;  

  7. using System.Web.UI.WebControls;  

  8. using System.Web.UI.WebControls.WebParts;  

  9. using System.Web.UI.HtmlControls;  

  10. [Serializable]  

  11. publicclass SSORequest : MarshalByRefObject  

  12. {  

  13.     publicstring IASID;         //各独立站点标识ID

  14.     publicstring TimeStamp;     //时间戳

  15.     publicstring AppUrl;        //各独立站点的访问地址

  16.     publicstring Authenticator; //各独立站点的 Token

  17.     publicstring UserAccount;   //账号

  18.     publicstring Password;      //密码

  19.     publicstring IPAddress;     //IP地址

  20.     //为ssresponse对象做准备

  21.     publicstring ErrorDescription = "认证失败";   //用户认证通过,认证失败,包数据格式不正确,数据校验不正确

  22.     publicint Result = -1;  

  23.     public SSORequest()  

  24.     {  

  25.     }  

  26.     /// <summary>

  27.     /// 获取当前页面上的SSORequest对象

  28.     /// </summary>

  29.     /// <param name="CurrentPage"></param>

  30.     /// <returns></returns>

  31.     publicstatic SSORequest GetRequest(Page CurrentPage)  

  32.     {  

  33.         SSORequest request = new SSORequest();  

  34.         request.IPAddress = CurrentPage.Request.UserHostAddress;  

  35.         request.IASID = CurrentPage.Request["IASID"].ToString();// Request本身会Decode

  36.         request.UserAccount = CurrentPage.Request["UserAccount"].ToString();//this.Text

  37.         request.Password = CurrentPage.Request["Password"].ToString();  

  38.         request.AppUrl = CurrentPage.Request["AppUrl"].ToString();  

  39.         request.Authenticator = CurrentPage.Request["Authenticator"].ToString();  

  40.         request.TimeStamp = CurrentPage.Request["TimeStamp"].ToString();  

  41.         return request;  

  42.     }  

  43. }  

配置web.config

  1. <authentication mode="Forms">   

  2.             <forms name=".AspxFormAuth" loginUrl="Default.aspx" defaultUrl="center.html" protection="All" path="/" timeout="60">   

  3.             </forms>   

  4.         </authentication>   

  5.         <authorization>   

  6.             <!--拒绝所有匿名用户-->   

  7.             <deny users="?"/>   

  8.         </authorization>  

[c-sharp] view plain copy print?

  1. <authentication mode="Forms">  

  2.             <forms name=".AspxFormAuth" loginUrl="Default.aspx" defaultUrl="center.html" protection="All" path="/" timeout="60">  

  3.             </forms>  

  4.         </authentication>  

  5.         <authorization>  

  6.             <!--拒绝所有匿名用户-->  

  7.             <deny users="?"/>  

  8.         </authorization>  

最后效果如下:登录总站后,各站点之间无需再登录,可以互相访问。

另外,注销登录后,访问站点1 http://localhost/Site1/Default.aspx ,会自动跳转到主站登录页面http://localhost/MasterSite/Default.aspx ,同样访问站点2 http://localhost/Site2/Default.aspx 也会转到主站登录页面。从主站登录后,分别访问站点1和站点2。

在IIS配置虚拟目录MasterSite Site1 Site2,当然你也可以新建站点MasterSite Site1 Site2,修改hosts表
127.0.0.1      http://www.mastersite.com/

127.0.0.1      http://www.site1.com/

127.0.0.1      http://www.site2.com/

源代码下载:http://download.csdn.net/source/1571879 


德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;
头条那些事
大家在关注
广告那些事
我们的推荐
也许感兴趣的
干货