基於.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