您的位置:首页 > 编程语言 > ASP

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

2014-12-30 11:57 399 查看
单点登录系统,简称SSO。以下是我花了几个小时写的一个简单实现。特把实现思路和大家分享。

背景:某项目使用ASP.NET MemberShip来做会员系统,需要同时登录多个系统。而项目的开发人员无法在MemberShip基础上做单点登录。

故这个单点登录系统需要能无缝集成到这些系统中的任何系统中,作为服务端。

下面我们来看看具体的实现步骤,没耐心看完的朋友可直接上github上查阅:(https://github.com/newmin/cms/blob/master/extend/Ops.Cms.Extend/SSO/):

一. 定义SSO的主要方法:

1. 客户端需要包含:登录,登出,获取会话

using System;
using System.Web;
using Ops.Cms.Extend.SSO;

namespace Ops.Cms.Extend.SSO.Client
{
public interface ISessionClient
{
/// <summary>
/// 处理SSO请求
/// </summary>
/// <param name="context"></param>
void HandleSsoRequest(HttpContext context);

/// <summary>
/// 获取会话
/// </summary>
/// <param name="sessionKey"></param>
/// <returns></returns>
SessionResult GetSession(String sessionKey);

/// <summary>
/// 获取会话Key
/// </summary>
/// <returns></returns>
String GetSessionKey();

/// <summary>
/// 同步登陆
/// </summary>
/// <param name="user"></param>
/// <param name="pwd"></param>
/// <returns></returns>
SsoResult Login(String user, String pwd);

/// <summary>
/// 同步登出
/// </summary>
/// <param name="sessionKey"></param>
/// <returns></returns>
SsoResult Logout(String sessionKey);
}
}


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐