1. 程式人生 > >基於.Net的單點登入(SSO)解決方案(2)

基於.Net的單點登入(SSO)解決方案(2)

//產生令牌
string tokenValue = Guid.NewGuid().ToString().ToUpper();
HttpCookie tokenCookie = new HttpCookie("Token");
tokenCookie.Values.Add("Value", tokenValue);
tokenCookie.Domain = "passport.com";
Response.AppendCookie(tokenCookie); 


 主站憑證:主站憑證是一個關係表,包含了三個欄位:令牌、憑證資料、過期時間。有多種實現方式可供選擇,要求可靠的話用資料庫,要求效能的話用Cache,DEMO中我使用的是Cache中的DataTable。如下程式碼所示:

/// <summary>
/// 初始化資料結構
/// </summary>
/// <remarks>
/// ----------------------------------------------------
/// | token(令牌) | info(使用者憑證) | timeout(過期時間) |
/// |--------------------------------------------------|
/// </remarks>
private static void cacheInit()
{
    if (HttpContext.Current.Cache["CERT"] == null)
    {
        DataTable dt = new DataTable();

        dt.Columns.Add("token", Type.GetType("System.String"));
        dt.Columns["token"].Unique = true;

        dt.Columns.Add("info", Type.GetType("System.Object"));
        dt.Columns["info"].DefaultValue = null;

        dt.Columns.Add("timeout", Type.GetType("System.DateTime"));
        dt.Columns["timeout"].DefaultValue = DateTime.Now.AddMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]));

        DataColumn[] keys = new DataColumn[1];
        keys[0] = dt.Columns["token"];
        dt.PrimaryKey = keys;

        //Cache的過期時間為 令牌過期時間*2
        HttpContext.Current.Cache.Insert("CERT", dt, null, DateTime.MaxValue, TimeSpan.FromMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]) * 2));
    }
}


分站憑證:分站憑證主要用於減少重複驗證時網路的互動,比如使用者已在分站a上登入過,當他再次訪問分站a時,就不必使用令牌去主站驗證了,因為分站a已有該使用者的憑證。分站憑證相對比較簡單,使用Session、Cookie均可。

      分站SSO頁面基類:分站使用SSO的頁面會做一系列的邏輯判斷處理,如文章開頭的流程圖。如果有多個頁面的話不可能為每個頁寫一個這樣的邏輯,OK,那麼把這套邏輯封裝成一個基類,凡是要使用SSO的頁面繼承該基類即可。如下程式碼所示:

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.RegularExpressions;

namespace SSO.SiteA.Class
{
    /// <summary>
    /// 授權頁面基類
    /// </summary>
    publicclass AuthBase : System.Web.UI.Page
    {
        protectedoverride void OnLoad(EventArgs e)
        {
            if (Session["Token"]!= null)
            {
                //分站憑證存在
                Response.Write("恭喜,分站憑證存在,您被授權訪問該頁面!");
            }
            else
            {
                //令牌驗證結果
                if (Request.QueryString["Token"]!= null)
                {
                    if (Request.QueryString["Token"]!= "$Token$")
                    {
                        //持有令牌
                        string tokenValue= Request.QueryString["Token"];
                        //呼叫WebService獲取主站憑證
                        SSO.SiteA.RefPassport.TokenService tokenService= new SSO.SiteA.RefPassport.TokenService();
                        object o= tokenService.TokenGetCredence(tokenValue);
                        if (o!= null)
                        {
                            //令牌正確
                            Session["Token"]= o;
                            Response.Write("恭喜,令牌存在,您被授權訪問該頁面!");
                        }
                        else
                        {
                            //令牌錯誤
                            Response.Redirect(this.replaceToken());
                        }
                    }
                    else
                    {
                        //未持有令牌
                        Response.Redirect(this.replaceToken());
                    }
                }
                //未進行令牌驗證,去主站驗證
                else
                {
                    Response.Redirect(this.getTokenURL());
                }
            }

            base.OnLoad(e);
        }

        /// <summary>
        /// 獲取帶令牌請求的URL
        /// 在當前URL中附加上令牌請求引數
        /// </summary>
        /// <returns></returns>
        privatestring getTokenURL()
        {
            string url= Request.Url.AbsoluteUri;
            Regex reg =new Regex(@"^.*\?.+=.+$");
            if (reg.IsMatch(url))
                url +="&Token=$Token$";
            else
                url +="?Token=$Token$";

            return"http://www.passport.com/gettoken.aspx?BackURL="+ Server.UrlEncode(url);
        }

        /// <summary>
        /// 去掉URL中的令牌
        /// 在當前URL中去掉令牌引數
        /// </summary>
        /// <returns></returns>
        privatestring replaceToken()
        {
            string url= Request.Url.AbsoluteUri;
            url = Regex.Replace(url,@"(\?|&)Token=.*","", RegexOptions.IgnoreCase);
            return"http://www.passport.com/userlogin.aspx?BackURL="+ Server.UrlEncode(url);
        }

    }//end class
}



使用者退出:使用者退出時分別清空主站憑證與當前分站憑證。如果要求A站點退出,B、C站點也退出,可自行擴充套件介面清空每個分站憑證。
      主站過期憑證/令牌清除:定時清除(DataTable)Cache[“CERT”]中timeout欄位超過當前時間的記錄。

點選此處下載DEMO

1.IIS中配置站點

配置4個站點指向相應的目錄,並分別指定4個站點的主機頭:

2.修改hosts檔案以將域名解析到本地站點

相關推薦

基於.Net登入(SSO)解決方案(2)

//產生令牌 string tokenValue = Guid.NewGuid().ToString().ToUpper(); HttpCookie tokenCookie = new HttpCookie("Token"); tokenCookie.Values.Add(

完全跨域的登入(SSO)解決方案原始碼解析

本文介紹的是一種PHP的開源SSO解決方案,可完全跨域,實現較簡潔,原始碼地址:github.com/legalthings… 實現原理 一共分為3個角色: Client - 使用者的瀏覽器 Broker - 使用者訪問的網站 Server - 儲存使用者資訊

登入解決方案

背景 專案組的多個子專案想要實現統一登入,也就是多個專案共用一個登入頁面,在A專案登入成功時,訪問B專案頁面時是不用登入的。 先說一波cookie的概念 在瀏覽器中,開啟控制檯,選擇Application,點選cookie下面的子選項,就可以看到cookie了。coo

登入解決方案(Session)

以前,做過的專案中有單點登入的模組,以前做的模組沒仔細觀察,檢視資料發現單點登入的解決方案還挺多!以下就記錄單點的不同解決方案;  http協議的特性 無狀態的,就是使用者連線只要獲取響應,伺服器不記錄使用者狀態,就算使用者訪問100次,伺服器也不知道使用者具體資訊; &nbs

登入解決方案-CAS

什麼是單點登入 單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 我們目前的系統存在諸多子系統,而這些子系統是分別部署在不同的伺服器

.Net 登入(SSO)的原理與實現------登入是什麼鬼

.Net 單點登入(SSO)的原理與實現——單點登入是什麼鬼 一、什麼是單點登入   在一些公司中,可能需要按照公司業務將系統拆分,例如騰訊的產品有騰訊視訊、QQ郵箱、QQ空間等;百度有百度貼吧,百度知道;阿里有淘寶、天貓….我們常常是登入了淘寶就可以直接進

.NET基於Redis快取實現登入SSO解決方案

一、基本概念 最近公司的多個業務系統要統一整合使用同一個登入,這就是我們耳熟能詳的單點登入,現在就NET基於Redis快取實現單點登入做一個簡單的分享。 單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義

SSO 登錄解決方案

ref 機制 源代碼 這不 host 視圖 tdi 新建 偽造 轉自:http://www.blogjava.net/Jack2007/archive/2014/03/11/191795.html 1 什麽是單點登陸 單點登錄(Single Sign On),

基於CAS的登入SSO[5]: 基於Springboot實現CAS客戶端的前後端分離

基於CAS的單點登入SSO[5]: 基於Springboot實現CAS客戶端的前後端分離 作者:家輝,日期:2017-08-24 CSDN部落格: http://blog.csdn.net/gobitan 摘要:現在大部分系統的開發都已經

基於CAS的登入SSO[4]: 加入兩個CAS客戶端測試登入

基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入 作者:家輝,日期:2017-08-22 CSDN部落格: http://blog.csdn.net/gobitan 摘要:本系列的前三篇文章分別搭建了基於CAS的單點登入伺服器,並讓伺

基於CAS的登入SSO[3]: 改造cas-overlays-template支援Redis儲存Ticket

基於CAS的單點登入SSO[3]: 改造cas-overlays-template支援Redis儲存Ticket 作者:家輝,日期:2017-08-20 CSDN部落格: http://blog.csdn.net/gobitan 摘要:預

一個簡單登入SSO的實現(.net到j2ee)

      單點登入實現的方式有很多,這裡介紹一種使用時間戳和md5加密的方式,實現了SSO整合端(由.net實現,在此稱為系統A)到應用系統B的單點登入(由j2ee實現,在此稱為系統B)。即登入了A

Apache Shiro:Java 認證授權框架 SSO 等了解決方案

package shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.config.IniSecurityManagerFactory; import or

基於IdentityServer4的OIDC實現登入(SSO)原理簡析

# 寫在前面 IdentityServer4的學習斷斷續續,兜兜轉轉,走了不少彎路,也花了不少時間。可能是因為沒有閱讀原始碼,也沒有特別系統的學習資料,相關文章很多園子裡的大佬都有涉及,有系列文章,比如: 曉晨大佬的:https://www.cnblogs.com/stulzq/p/8119928.ht

CAS 登出 loginout 解決方案 -- 最靠譜的方案,不是抄的--還是不靠譜大家不要抄了

mmp,從11年開始用cas,但是總是在退出的時候掉鏈子,各種掉線子 從2.x版本開始用現在都4.2.7版本都沒解決這個退出掉鏈子的事情,於是自己看原始碼解決了此問題。     cas 預設的基於 httpclient http 通知的,通知的時候,服務端給客戶端發一個x

CAS實現登入SSO執行原理探究(終於明白了)

一、不落俗套的開始 1、背景介紹 單點登入:Single Sign On,簡稱SSO,SSO使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 CAS框架:CAS(Central Authentication Service)是實現S

Asp.net 登入實現

最近有個需求,就是針對內部多個的web應用實現從OA(古老的asp.net)的單點登入,其他系統可以通過連結免輸入帳號密碼登入,以下是我實現的技術方案。  在主應用系統登入時,將會話資訊儲存到資料庫中,作為授權其他應用系統免登入授權憑據。流程如下: 資料庫儲存的主要授權資訊:使用者當前IP

登入SSO:可一鍵執行的完整程式碼

單點登入方案不同於一個普通站點,它的部署比較繁瑣:涉及到好幾個站點,要改host、安裝證書、配置HTTPS。 看到的不少這方面示例都是基於HTTP的,不認同這種簡化: 1. 它體現不出混合HTTP/HTTPS時,單點登出要注意處理的問題; 2. 做單點登入一定要有絕不能走HTTP傳遞使用者登入資訊的

登入SSO:圖示和講解

敢說最準確的單點登入圖示,因為: 我嚴格對照所畫時序圖的每個步驟,開發了完整的跨域單點登入範例; 時序圖繪出的所有服務端步驟,都在程式碼中逐一標註對應,跟蹤除錯程式碼就能兩相對照,深入理解流程; 跨域Web SSO的核心在於寫cookie、URL傳參策略。其參與物件多、邏輯分支繁雜也

登入SSO:概述與示例

本系列將由淺入深的,帶大家掌握最新單點登入SSO方案選型,以及架構開發實戰。系列將結合示例、原始碼以及演示視訊,讓大家能夠直觀、深入學習。 文末附5個滿足不同單點登入場景的gif動畫演示。本系列後繼文章會深入它們的實現方式以及適用場景,大家也可以先觀看揣摩其實現。 單點登入即Single