zoukankan      html  css  js  c++  java
  • 教你开发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

  • 相关阅读:
    【Rust】多种错误类型
    【Rust】Result别名
    【Rust】Option然后
    【Rust】可选和错误
    【Rust】Result问号
    【Rust】Option转换
    【Rust】Option展开
    【Rust】Result结果
    【Rust】Result提前返回
    jQuery过滤 安静点
  • 原文地址:https://www.cnblogs.com/webenh/p/6177807.html
Copyright © 2011-2022 走看看