asp.net跨域单点击登录

之前做单点击的时候,利用的Session,可是来做跨域的时候,发现Session无法完成跨域这个功能,只能用Cookie来完成,而Cookie的用法,我想凡是学.net的都知道它的用法了.接下来我们来看看Cookie是怎么实现跨域单点击登录的。

首先我们得先建立一个项目Passport,建立完成之后呢,就再建立一个Common类库,这个Common在这里起到很的作用,建立好Common之后我们在Common类库下面创建五个类文件,分别为Authentication(安全验证类)CryptoHelper(加密转换类)CryptoService(加密服务类)PostService(post服务类)SSORequest(单点登录请求)创建好这五个类文件之后,我们来给它们分别写人对应的代码:


SSORequest类文件代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Common
{
    [Serializable]
    public class SSORequest : MarshalByRefObject
    {
        public string IASID; //各独立站点标识ID 
        public string TimeStamp; //时间戳 
        public string AppUrl; //各独立站点的访问地址 
        public string Authenticator; //各独立站点的 Token 
        public string UserAccount; //账号 
        public string Password; //密码 
        public string IPAddress; //IP地址 

        //为ssresponse对象做准备 
        public string ErrorDescription = "认证失败"; //用户认证通过,认证失败,包数据格式不正确,数据校验不正确 
        public int Result = -1;

        public SSORequest()
        {
        }
        /// <summary> 
        /// 获取当前页面上的SSORequest对象 
        /// </summary> 
        /// <param name=”CurrentPage”></param> 
        /// <returns></returns> 
        public static SSORequest GetRequest(Page CurrentPage)
        {
            SSORequest request = new SSORequest();
            request.IPAddress = CurrentPage.Request.UserHostAddress;
            request.IASID = CurrentPage.Request["IASID"].ToString();// Request本身会Decode 
            request.UserAccount = CurrentPage.Request["UserAccount"].ToString();//this.Text 
            request.Password = CurrentPage.Request["Password"].ToString();
            request.AppUrl = CurrentPage.Request["AppUrl"].ToString();
            request.Authenticator = CurrentPage.Request["Authenticator"].ToString();
            request.TimeStamp = CurrentPage.Request["TimeStamp"].ToString();
            return request;
        }
    }
}


PostService类文件代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common
{
    public class PostService
    {
        private System.Collections.Specialized.NameValueCollection Inputs = new System.Collections.Specialized.NameValueCollection();
        public string Url = "";
        public string Method = "post";
        public string FormName = "form1";

        /// <summary> 
        /// 添加需要提交的名和值 
        /// </summary> 
        /// <param name="name"></param> 
        /// <param name="value"></param> 
        public void Add(string name, string value)
        {
            Inputs.Add(name, value);
        }
        /// <summary> 
        /// 以输出Html方式POST 
        /// </summary> 
        public void Post()
        {
            System.Web.HttpContext.Current.Response.Clear();
            string html = string.Empty;
            html += ("<html><head>");
            html += (string.Format("</head ><body onload =\"document.{0}.submit()\">", FormName));
            html += (string.Format("<form name =\"{0}\" method =\"{1}\" action =\"{2}\">", FormName, Method, Url));
            try
            {
                for (int i = 0; i < Inputs.Keys.Count; i++)
                {
                    html += (string.Format("<input name =\"{0}\" type =\"hidden\" value =\"{1}\">", Inputs.Keys[i], Inputs[Inputs.Keys[i]]));
                }
                html += ("</form>");
                html += ("</body></html>");
                System.Web.HttpContext.Current.Response.Write(html);
                System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
            }
            catch (Exception ee)
            {
                // 
            }
        }
    }
}


CryptoService类文件代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Common
{
    public class CryptoService
    {
        /// <summary> 
        /// 加密的密钥 
        /// </summary> 
        string sKey = "22362E7A9285DD53A0BBC2932F9733C505DC04EDBFE00D70";
        string sIV = "1E7FA9231E7FA923";
        byte[] byteKey;
        byte[] byteIV;
        // <summary> 
        /// 加密向量 
        /// </summary> 
        static byte[] bIV = { 1, 2, 3, 4, 5, 6, 7, 8 };
        public CryptoService()
        {
        }
        public CryptoService(string key, string IV)
        {
            sKey = key;
            sIV = IV;
            byteKey = CryptoHelper.HexStringToByteArray(sKey);
            byteIV = CryptoHelper.HexStringToByteArray(sIV);
        }
        /// <summary> 
        /// 将明文加密,返回密文 
        /// </summary> 
        /// <param name="Data">要加密的字串</param> 
        /// <returns></returns> 
        public byte[] Encrypt(string Data)
        {
            try
            {
                byte[] ret;
                using (MemoryStream mStream = new MemoryStream())
                using (CryptoStream cStream = new CryptoStream(mStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),
                CryptoStreamMode.Write))
                {
                    byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);
                    cStream.Write(toEncrypt, 0, toEncrypt.Length);
                    cStream.FlushFinalBlock();
                    ret = mStream.ToArray();
                }
                return ret;
            }
            catch (CryptographicException e)
            {
                //Console.WriteLine(”A Cryptographic error occurred: {0}”, e.Message); 
                return null;
            }
        }
        /// <summary> 
        /// 将明文加密,返回密文 
        /// </summary> 
        /// <param name="toEncrypt">明文</param> 
        /// <param name="encrypted">密文</param> 
        /// <returns></returns> 
        public bool Encrypt(byte[] toEncrypt, out byte[] encrypted)
        {
            encrypted = null;
            try
            {
                using (MemoryStream mStream = new MemoryStream())
                using (CryptoStream cStream = new CryptoStream(mStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),
                CryptoStreamMode.Write))
                {
                    cStream.Write(toEncrypt, 0, toEncrypt.Length);
                    cStream.FlushFinalBlock();
                    encrypted = mStream.ToArray();
                }
                return true;
            }
            catch (CryptographicException e)
            {
                //Console.WriteLine(”A Cryptographic error occurred: {0}”, e.Message); 
                return false;
            }
        }
        /// <summary> 
        /// 将明文加密,返回 Base64 字符串 
        /// </summary> 
        /// <param name="Data"></param> 
        /// <returns></returns> 
        public string EncryptToString(string Data)
        {
            try
            {
                string base64String = string.Empty;
                using (MemoryStream mStream = new MemoryStream())
                using (CryptoStream cStream = new CryptoStream(mStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteIV),
                CryptoStreamMode.Write))
                {
                    byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);
                    cStream.Write(toEncrypt, 0, toEncrypt.Length);
                    cStream.FlushFinalBlock();
                    byte[] ret = mStream.ToArray();
                    base64String = Convert.ToBase64String(ret);
                }
                return base64String;
            }
            catch (CryptographicException e)
            {
                return null;
            }
        }
        /// <summary> 
        /// 将密文解密,返回明文 
        /// </summary> 
        /// <param name="Data">密文</param> 
        /// <returns>明文</returns> 
        public bool Decrypt(byte[] Data, out string decrypted)
        {
            decrypted = string.Empty;
            try
            {
                using (MemoryStream msDecrypt = new MemoryStream(Data))
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                new TripleDESCryptoServiceProvider().CreateDecryptor(byteKey, byteIV),
                CryptoStreamMode.Read))
                {
                    byte[] fromEncrypt = new byte[Data.Length];
                    csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
                    decrypted = Encoding.UTF8.GetString(fromEncrypt);//new ASCIIEncoding().GetString(fromEncrypt); 
                    return true;
                }
            }
            catch (CryptographicException e)
            {
                return false;
            }
        }
    }
}


CryptoHelper类文件代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;

namespace Common
{
    public class CryptoHelper
    {
        /// <summary> 
        /// 复合 Hash:string --> byte[] --> hashed byte[] --> base64 string 
        /// </summary> 
        /// <param name="s"></param> 
        /// <returns></returns> 
        public static string ComputeHashString(string s)
        {
            return ToBase64String(ComputeHash(ConvertStringToByteArray(s)));
        }
        public static byte[] ComputeHash(byte[] buf)
        {
            //return ((HashAlgorithm)CryptoConfig.CreateFromName(”SHA1”)).ComputeHash(buf);
            return SHA1.Create().ComputeHash(buf);
        }
        /// <summary> 
        /// //System.Convert.ToBase64String 
        /// </summary> 
        /// <param name="buf"></param> 
        /// <returns></returns> 
        public static string ToBase64String(byte[] buf)
        {
            return System.Convert.ToBase64String(buf);
        }
        public static byte[] FromBase64String(string s)
        {
            return System.Convert.FromBase64String(s);
        }
        /// <summary> 
        /// //Encoding.UTF8.GetBytes(s) 
        /// </summary> 
        /// <param name="s"></param> 
        /// <returns></returns> 
        public static byte[] ConvertStringToByteArray(String s)
        {
            return Encoding.UTF8.GetBytes(s);//gb2312 
        }
        public static string ConvertByteArrayToString(byte[] buf)
        {
            //return System.Text.Encoding.GetEncoding("utf-8").GetString(buf); 
            return Encoding.UTF8.GetString(buf);
        }
        /// <summary> 
        /// 字节数组转换为十六进制字符串 
        /// </summary> 
        /// <param name="buf"></param> 
        /// <returns></returns> 
        public static string ByteArrayToHexString(byte[] buf)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < buf.Length; i++)
            {
                sb.Append(buf[i].ToString("X").Length == 2 ? buf[i].ToString("X") : "0" + buf[i].ToString("X"));
            }
            return sb.ToString();
        }
        /// <summary> 
        /// 十六进制字符串转换为字节数组 
        /// </summary> 
        /// <param name="s"></param> 
        /// <returns></returns> 
        public static byte[] HexStringToByteArray(string s)
        {
            Byte[] buf = new byte[s.Length / 2];
            for (int i = 0; i < buf.Length; i++)
            {
                buf[i] = (byte)(Char2Hex(s.Substring(i * 2, 1)) * 0x10 + Char2Hex(s.Substring(i * 2 + 1, 1)));
            }
            return buf;
        }
        private static byte Char2Hex(string chr)
        {
            switch (chr)
            {
                case "0":
                    return 0x00;
                case "1":
                    return 0x01;
                case "2":
                    return 0x02;
                case "3":
                    return 0x03;
                case "4":
                    return 0x04;
                case "5":
                    return 0x05;
                case "6":
                    return 0x06;
                case "7":
                    return 0x07;
                case "8":
                    return 0x08;
                case "9":
                    return 0x09;
                case "A":
                    return 0x0a;
                case "B":
                    return 0x0b;
                case "C":
                    return 0x0c;
                case "D":
                    return 0x0d;
                case "E":
                    return 0x0e;
                case "F":
                    return 0x0f;
            }
            return 0x00;
        }
    }
}


Authentication类文件代码:

using System.Web;
using System.Web.Security;
using System.Collections.Generic;
using System.Text;

namespace Common
{
    /// <summary> 
    /// 安全验证类 
    /// </summary> 
    public class Authentication
    {
        static readonly string cookieName = "EACToken";
        static readonly string hashSplitter = "|";
        public Authentication()
        {
        }
        public static string GetAppKey(int appID)
        {
            //string cmdText = @”select * from ”; 
            return string.Empty;
        }
        public static string GetAppKey()
        {
            return "22362E7A9285DD53A0BBC2932F9733C505DC04EDBFE00D70";
        }
        public static string GetAppIV()
        {
            return "1E7FA9231E7FA923";
        }
        /// <summary> 
        /// 取得加密服务 
        /// </summary> 
        /// <returns></returns> 
        static CryptoService GetCryptoService()
        {
            string key = GetAppKey();
            string IV = GetAppIV();
            CryptoService cs = new CryptoService(key, IV);
            return cs;
        }
        /// <summary> 
        /// 创建各分站发往认证中心的 Token 
        /// </summary> 
        /// <param name="ssoRequest"></param> 
        /// <returns></returns> 
        public static bool CreateAppToken(SSORequest ssoRequest)
        {
            string OriginalAuthenticator = ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;
            string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);
            string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;
            byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);
            CryptoService cs = GetCryptoService();
            byte[] encrypted;
            if (cs.Encrypt(bToEncrypt, out encrypted))
            {
                ssoRequest.Authenticator = CryptoHelper.ToBase64String(encrypted);
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary> 
        /// 验证从各分站发送过来的 Token 
        /// </summary> 
        /// <param name="ssoRequest"></param> 
        /// <returns></returns> 
        public static bool ValidateAppToken(SSORequest ssoRequest)
        {
            string Authenticator = ssoRequest.Authenticator;
            string OriginalAuthenticator = ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;
            string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);
            string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;
            byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);
            CryptoService cs = GetCryptoService();
            byte[] encrypted;
            if (cs.Encrypt(bToEncrypt, out encrypted))
            {
                return Authenticator == CryptoHelper.ToBase64String(encrypted);
            }
            else
            {
                return false;
            }
        }
        /// <summary> 
        /// 创建认证中心发往各分站的 Token 
        /// </summary> 
        /// <param name="ssoRequest"></param> 
        /// <returns></returns> 
        public static bool CreateEACToken(SSORequest ssoRequest)
        {
            string OriginalAuthenticator = ssoRequest.UserAccount + ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;
            string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);
            string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;
            byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);
            CryptoService cs = GetCryptoService();
            byte[] encrypted;
            if (cs.Encrypt(bToEncrypt, out encrypted))
            {
                ssoRequest.Authenticator = CryptoHelper.ToBase64String(encrypted);
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary> 
        /// 验证从认证中心发送过来的 Token 
        /// </summary> 
        /// <param name="ssoRequest"></param> 
        /// <returns></returns> 
        public static bool ValidateEACToken(SSORequest ssoRequest)
        {
            string Authenticator = ssoRequest.Authenticator;
            string OriginalAuthenticator = ssoRequest.UserAccount + ssoRequest.IASID + ssoRequest.TimeStamp + ssoRequest.AppUrl;
            string AuthenticatorDigest = CryptoHelper.ComputeHashString(OriginalAuthenticator);
            string sToEncrypt = OriginalAuthenticator + AuthenticatorDigest;
            byte[] bToEncrypt = CryptoHelper.ConvertStringToByteArray(sToEncrypt);
            string EncryCurrentAuthenticator = string.Empty;
            CryptoService cs = GetCryptoService();
            byte[] encrypted;
            if (cs.Encrypt(bToEncrypt, out encrypted))
            {
                EncryCurrentAuthenticator = CryptoHelper.ToBase64String(encrypted);
                return Authenticator == EncryCurrentAuthenticator;
            }
            else
            {
                return false;
            }
        }
        /// <summary> 
        /// 创建 EAC 认证中心的 Cookie 
        /// </summary> 
        /// <param name="userAccount"></param> 
        /// <param name="timeStamp"></param> 
        /// <param name="expireTime"></param> 
        /// <param name="cookieValue"></param> 
        /// <returns></returns> 
        public static bool CreatEACCookie(string userAccount, string timeStamp, string expireTime)
        {
            string plainText = "UserAccount =" + userAccount + "; TimeStamp =" + timeStamp + "; ExpireTime =" + expireTime;
            plainText += hashSplitter + CryptoHelper.ComputeHashString(plainText);
            CryptoService cs = GetCryptoService();
            byte[] encrypted;
            if (cs.Encrypt(CryptoHelper.ConvertStringToByteArray(plainText), out encrypted))
            {
                string cookieValue = CryptoHelper.ToBase64String(encrypted);
                SetCookie(cookieValue);
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary> 
        /// 验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号 
        /// </summary> 
        /// <param name="userAccount">输出用户登录账号</param> 
        /// <returns></returns> 
        public static bool ValidateEACCookie(out string userAccount)
        {
            userAccount = string.Empty;
            try
            {
                string cookieValue = GetCookie().Value;
                byte[] toDecrypt = CryptoHelper.FromBase64String(cookieValue);
                CryptoService cs = GetCryptoService();
                string decrypted = string.Empty;
                if (cs.Decrypt(toDecrypt, out decrypted))
                {
                    string[] arrTemp = decrypted.Split(Convert.ToChar(hashSplitter));
                    string plainText = arrTemp[0];
                    string hashedText = arrTemp[1];
                    userAccount = plainText.Split(Convert.ToChar(";"))[0].Split(Convert.ToChar("="))[1];
                    return hashedText.Replace("\0", string.Empty) == CryptoHelper.ComputeHashString(plainText);
                }
                else
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                return false;
            }
        }
        public static void Logout()
        {
            HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Parse("1900 - 1 - 1");
            HttpContext.Current.Response.Cookies[cookieName].Path = "/";
        }
        private static void SetCookie(string cookieValue)
        {
            HttpContext.Current.Response.Cookies[cookieName].Value = cookieValue;
            HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Now.AddHours(24);
            HttpContext.Current.Response.Cookies[cookieName].Path = "/";
        }
        private static HttpCookie GetCookie()
        {
            HttpCookie cookie = HttpContext.Current.Request.Cookies["EACToken"];
            return cookie;
        }
    }
}


这时候我们已经创建好这个五个类文件了,这是我们来创建我们的两个网站分别是总站点(MasterSite)站点1(Site1),总站点是为登录网站,而站点1是检测该用户有没有在总站点登录,如果有登录就显示站点1的内容否则就跳转到总站点登录。


创建总站点MasterSite:新建网站起名为MasterSite然后在MasterSite总站点里面添加新网页Default.aspx(登录页)SiteList.aspx(登录之后显示的页面)

SiteList.aspx 页面是写登录后 的页面,我这里作为测试,我就不写任何代码了


Default.aspx页面的HTML代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MasterSite.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
   <title>总站登录</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate" UserName="test">
            </asp:Login>
        </div>
    </form>
</body>
</html>


Default.aspx页面的后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Common;
using System.Web.Security;

namespace MasterSite
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                SSORequest ssoRequest = new SSORequest();
                #region 验证 Post 过来的参数 
                //-------------------------------- 
                // 请求注销 
                if (!string.IsNullOrEmpty(Request["Logout"]))
                {
                    Authentication.Logout();
                    return;
                }
                //-------------------------------- 
                // 各独立站点标识 
                if (string.IsNullOrEmpty(Request["IASID"]))
                {
                    return;
                }
                else
                {
                    ssoRequest.IASID = Request["IASID"];
                }
                //-------------------------------- 
                // 时间戳 
                if (string.IsNullOrEmpty(Request["TimeStamp"]))
                {
                    return;
                }
                else
                {
                    ssoRequest.TimeStamp = Request["TimeStamp"];
                }


                //-------------------------------- 
                // 各独立站点的访问地址 
                if (string.IsNullOrEmpty(Request["AppUrl"]))
                {
                    return;
                }
                else
                {
                    ssoRequest.AppUrl = Request["AppUrl"];
                }


                //-------------------------------- 
                // 各独立站点的 Token 
                if (string.IsNullOrEmpty(Request["Authenticator"]))
                {
                    return;
                }
                else
                {
                    ssoRequest.Authenticator = Request["Authenticator"];
                }


                ViewState["SSORequest"] = ssoRequest;


                #endregion
                // 验证从分站发过来的Token
                if (Authentication.ValidateAppToken(ssoRequest))
                {
                    string userAccount = null;

                    // 验证用户之前是否登录过 
                    //验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号 
                    if (Authentication.ValidateEACCookie(out userAccount))
                    {
                        ssoRequest.UserAccount = userAccount;

                        //创建认证中心发往各分站的 Token 
                        if (Authentication.CreateEACToken(ssoRequest))
                        {
                            Post(ssoRequest);
                        }
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
            }
        }
        //post请求 
        void Post(SSORequest ssoRequest)
        {
            PostService ps = new PostService();
            ps.Url = ssoRequest.AppUrl;
            ps.Add("UserAccount", ssoRequest.UserAccount);
            ps.Add("IASID", ssoRequest.IASID);
            ps.Add("TimeStamp", ssoRequest.TimeStamp);
            ps.Add("AppUrl", ssoRequest.AppUrl);
            ps.Add("Authenticator", ssoRequest.Authenticator);
            ps.Post();
        }
        /// <summary> 
        /// 验证登录账号和密码是否正确 
        /// </summary> 
        /// <param name=”userName”>登录账号</param> 
        /// <param name=”userPwd”>登录密码</param> 
        /// <returns></returns> 
        private bool ValidateUserInfo(string userName, string userPwd)
        {
            //从数据库中读取,验证登录账号和密码 
            //略... 
            return true;
        }


        protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
        {
            if (string.IsNullOrEmpty(Login1.UserName) || string.IsNullOrEmpty(Login1.Password))
            {
                Page.RegisterClientScriptBlock("Add", "< mce:script lanuage =\"javascript\">< !--alert('用户名和密码不能为空');// --></mce:script>");
                return;
            }
            //else if (ValidateUserInfo(Login1.UserName, Login1.Password) == false)
            //{
            //    Page.RegisterClientScriptBlock("Add", "< mce:script lanuage =\"javascript\">< !--alert('用户名密码错误!');// --></mce:script>");
            //    return;
            //}
            else
            {
                Session["CurrUserName"] = Login1.UserName;
                Session.Timeout = 120;
                SSORequest ssoRequest = ViewState["SSORequest"] as SSORequest;
                // 如果不是从各分站 Post 过来的请求,则默认登录主站 
                if (ssoRequest == null)
                {
                    FormsAuthentication.SetAuthCookie(Login1.UserName, false);
                    ssoRequest = new SSORequest();
                    //主站标识ID 
                    ssoRequest.IASID = "00";
                    ssoRequest.AppUrl = "SiteList.aspx";
                    ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy - MM - dd HH: mm");
                    ssoRequest.Authenticator = string.Empty;
                    //Response.Redirect("Default.aspx");
                }
                ssoRequest.UserAccount = Login1.UserName;
                //创建Token 
                if (Authentication.CreateEACToken(ssoRequest))
                {
                    string expireTime = DateTime.Now.AddHours(3).ToString("yyyy - MM - dd HH: mm");
                    Authentication.CreatEACCookie(ssoRequest.UserAccount, ssoRequest.TimeStamp, expireTime);
                    Post(ssoRequest);
                    Response.Redirect("SiteList.aspx");
                }
            }
        }
    }
}

总网站的代码写好了,这时候我们就得在MasterSite网站的Web.config文件里面写配置。


配置代码为:

<configuration>
  <connectionStrings/>
  <system.web>
    <authentication mode="Forms">
      <forms name=".AspxFormAuth" loginUrl="Default.aspx" defaultUrl="center.html" protection="All" path="/" timeout="120"/>
    </authentication>
    <authorization>
      <!--拒绝所有匿名用户-->
      <deny users="?"/>
    </authorization>
    <compilation debug="true"/>
  </system.web>
  <appSettings>
    <add key="owin:AutomaticAppStartup" value="false" />
  </appSettings>
</configuration>


这样我们的总网站已经写好了。接下来是要创建站点1的页面了。在解决方案添加新的网站起名Site1,并且新建网页Default.aspx


Default.aspx的HTML代码:

<head runat="server">

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>站点一</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <br />
            <br />
            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">返回主站</asp:LinkButton>
             <br />
             <br />
            <asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkButton2_Click">注销登录</asp:LinkButton>
        </div>
    </form>
</body>
</html>

Default.aspx的后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using Common;


namespace Site1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                #region SSO 部分代码 
                SSORequest ssoRequest = new SSORequest();
                if (string.IsNullOrEmpty(Request["IASID"]))
                {
                    ssoRequest.IASID = "01";
                    ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy - MM - dd HH: mm");
                    ssoRequest.AppUrl = Request.Url.ToString();
                    Authentication.CreateAppToken(ssoRequest);
                    Post(ssoRequest);
                }
                else if (!string.IsNullOrEmpty(Request["IASID"])
                && !string.IsNullOrEmpty(Request["TimeStamp"])
                && !string.IsNullOrEmpty(Request["AppUrl"])
                && !string.IsNullOrEmpty(Request["UserAccount"])
                && !string.IsNullOrEmpty(Request["Authenticator"]))
                {
                    ssoRequest.IASID = Request["IASID"];
                    ssoRequest.TimeStamp = Request["TimeStamp"];
                    ssoRequest.AppUrl = Request["AppUrl"];
                    ssoRequest.UserAccount = Request["UserAccount"];
                    ssoRequest.Authenticator = Request["Authenticator"];
                    if (Authentication.ValidateEACToken(ssoRequest))
                    {
                        //从数据库中获取UserId 
                        Session["CurrUserName"] = Request["UserAccount"];
                        Session.Timeout = 120;
                        FormsAuthentication.SetAuthCookie(Request["UserAccount"], false);
                        //Response.Write(string.Format("{ 0},您好!欢迎来到site1, >> 访问 < a href ='\' mce_href ='\'http://localhost:33692/Site2/Default.aspx\'>site2</a>", ssoRequest.UserAccount));
                    }
                    ViewState["SSORequest"] = ssoRequest;
                    #endregion
                }
            }
        }
        void Post(SSORequest ssoRequest)
        {
            PostService ps = new PostService();
            //认证中心(主站)地址 
            string EACUrl = "http://localhost:33692/Default.aspx";
            ps.Url = EACUrl;
            //ps.Add(”UserAccount”, ssoRequest.UserAccount); 
            ps.Add("IASID", ssoRequest.IASID);
            ps.Add("TimeStamp", ssoRequest.TimeStamp);
            ps.Add("AppUrl", ssoRequest.AppUrl);
            ps.Add("Authenticator", ssoRequest.Authenticator);
            ps.Post();
        }


        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            if (Session["CurrUserName"] != null)
            {
                Response.Redirect("http://localhost:33692/SiteList.aspx");
            }
        }


        protected void LinkButton2_Click(object sender, EventArgs e)
        {
            FormsAuthentication.SignOut();
            SSORequest ssoRequest = new SSORequest();
            ssoRequest.IASID = "01";
            ssoRequest.TimeStamp = DateTime.Now.ToString("yyyy - MM - dd HH: mm");
            ssoRequest.AppUrl = Request.Url.ToString();
            Authentication.CreateAppToken(ssoRequest);
            PostService ps = new PostService();
            //认证中心(主站)地址 
            string EACUrl = "http://localhost:33692/Default.aspx";
            ps.Url = EACUrl;
            ps.Add("IASID", ssoRequest.IASID);
            ps.Add("TimeStamp", ssoRequest.TimeStamp);
            ps.Add("AppUrl", ssoRequest.AppUrl);
            ps.Add("Authenticator", ssoRequest.Authenticator);
            ps.Add("Logout", "true");
            ps.Post();
        }
    }
}

站点1的代码写好了,这时候我们就得在Site1网站的Web.config文件里面写配置。


配置代码:

<configuration>
  <connectionStrings/>
  <system.web>
    <authentication mode="Forms">
      <forms name=".AspxFormAuth" loginUrl="Default.aspx" defaultUrl="center.html" protection="All" path="/" timeout="120"/>
    </authentication>
    <authorization>
      <!--拒绝所有匿名用户-->
      <deny users="?"/>
    </authorization>
    <compilation debug="true"/>
  </system.web>
  <appSettings>
    <add key="owin:AutomaticAppStartup" value="false" />
  </appSettings>
</configuration>


代码写到这里基本就完成。

说明:Site1站点的Default页面中的后台代码http://localhost:33692/Default.aspx这串网址是我的测试的网址,如果要测试的话请改变你测试的网址路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值