佛山软件定制

教你开发asp.net的单点登录系统

单点登录系统,简称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         /// 获取会话Key
24         /// </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

 

posted on   New.min  阅读(3659)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

点击右上角即可分享
微信分享提示