標籤:方法 服務 asp.net 資訊 use 需要 步驟 ace 整合
單點登入系統,簡稱SSO。以下是我花了幾個小時寫的一個簡單實現。特把實現思路和大家分享。
背景:某項目使用ASP.NET MemberShip來做會員系統,需要同時登入多個系統。而項目的開發人員無法在MemberShip基礎上做單點登入。
故這個單點登入系統需要能無縫整合到這些系統中的任何系統中,作為服務端。
下面我們來看看具體的實現步驟,沒耐心看完的朋友可直接上github上查閱:(https://github.com/newmin/cms/blob/master/extend/Ops.Cms.Extend/SSO/):
一. 定義SSO的主要方法:
1. 用戶端需要包含:登入,登出,擷取會話
1 using System; 2 using System.Web; 3 using Ops.Cms.Extend.SSO; 4 5 namespace Ops.Cms.Extend.SSO.Client 6 { 7 public interface ISessionClient 8 { 9 /// <summary>10 /// 處理SSO請求11 /// </summary>12 /// <param name="context"></param>13 void HandleSsoRequest(HttpContext context);14 15 /// <summary>16 /// 擷取會話17 /// </summary>18 /// <param name="sessionKey"></param>19 /// <returns></returns>20 SessionResult GetSession(String sessionKey);21 22 /// <summary>23 /// 擷取會話Key24 /// </summary>25 /// <returns></returns>26 String GetSessionKey();27 28 /// <summary>29 /// 同步登陸30 /// </summary>31 /// <param name="user"></param>32 /// <param name="pwd"></param>33 /// <returns></returns>34 SsoResult Login(String user, String pwd);35 36 /// <summary>37 /// 同步登出38 /// </summary>39 /// <param name="sessionKey"></param>40 /// <returns></returns>41 SsoResult Logout(String sessionKey);42 }43 }
2. 服務端需要處理用戶端的請求,同時包含會話的管理,以及用戶端的註冊
using System;using System.Collections.Generic;using System.Text;using System.Web;using Ops.Framework.Extensions;namespace Ops.Cms.Extend.SSO.Server{ public class SessionServer { /// <summary> /// 註冊用戶端 /// </summary> /// <param name="url"></param> public void RegisterClient(String url) /// <summary> /// 會話管理 /// </summary> public SessionManager SessionManager /// <summary> /// 會話服務響應 /// </summary> public String Process(HttpContext context) /// <summary> /// 登陸 /// </summary> /// <param name="usr"></param> /// <param name="pwd"></param> /// <returns></returns> private SsoResult Login(string usr, string pwd) /// <summary> /// 退出登陸 /// </summary> /// <param name="sessionKey"></param> /// <returns></returns> private SsoResult LoginOut(string sessionKey) }}
2.1 用戶端註冊
將用戶端註冊,在返回登入/登出結果的時候,會請求所有用戶端,以實現同步。
2.2 會話管理
需要儲存會員和會話鍵之間的關係,在這個實現中我使用了KV資料庫,LevelDb來支援。
同時定義了ISessionSet,意味著可以使用任何方式來儲存會話,只要實現了ISessionSet介面
ISessionSet.cs
namespace Ops.Cms.Extend.SSO{ /// <summary> /// 會話資料集合 /// </summary> public interface ISessionSet { /// <summary> /// 更新會話資訊 /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns>返回之前的會話資訊</returns> string Put(string key, string value); /// <summary> /// 刪除會話資訊 /// </summary> /// <param name="key"></param> void Delete(string key); /// <summary> /// 擷取會話資訊 /// </summary> /// <param name="key"></param> string Get(string key); }}
三。驗證會員
因為會員不存在於此SSO中,故定義了委託,在初始化服務端時,傳入委託即可。
namespace Ops.Cms.Extend.SSO{ /// <summary> /// 登陸處理 /// </summary> /// <param name="usr"></param> /// <param name="pwd"></param> /// <returns>返回personId</returns> public delegate int SSOLoginHandler(string usr,string pwd);}
委託返回int值,為會員的編號,所以我們還需要定義一個擷取會員資訊的委託
namespace Ops.Cms.Extend.SSO{ /// <summary> /// 人員擷取處理事件 /// </summary> /// <param name="personId"></param> /// <returns></returns> public delegate Person PersonFetchHandler(int personId);}
四. 啟動服務端
至此,我們已經完成了基本實現。
PS: 好久沒有發部落格了,好辛苦。直接附上DEMO:
https://github.com/newmin/cms/blob/master/extend/Ops.Cms.Extend/SSO/Demo/server.ashx.cs
教你開發asp.net的單點登入系統