单点登录(SSO)的实现方式

转载 2014年07月09日 11:59:00

SSO的基本概念

SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。(本段内容来自百度百科)

今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善!

二级域名的单点登录

什么是二级域名呢?例如:

  • site1.domain.com
  • site2.domain.com

对于二级域名的单点登录,我们可以非常方便的通过共享cookie来实现,简单的说,就是在设置Form票据的时候,将cookie的domain设置为顶级域名即可,例如:

HttpCookie cookie = new HttpCookie(FormsAuthCookieName, encryptedTicket);
cookie.Expires = rememberMe ? expirationDate : DateTime.MinValue;
cookie.HttpOnly = true;
cookie.Path = "/";
cookie.Domain = "domain.com";
context.Response.Cookies.Set(cookie);

这种方式不涉及跨域,当cookie的domain属性设置为顶级域名之后,所有的二级域名都可以访问到身份验证的cookie,在服务器端只要验证了这个cookie就可以实现身份的验证。

但是,当跨域的时候,例如:

  • site1.com
  • site2.com

这个时候就不能共享cookie了,所以上面的解决方案就会失效。那么,要实现跨域的单点登录该如何做呢?请继续往下看。

跨域的单点登录

关于跨域的SSO的设计思路,我画了一个简单的流程图:

image

首先,我将跨域的SSO分为SSO-Server和SSO-Client两个部分,SSO-Client可以是多个的。

SSO-Server

SSO-Server主要负责用户登录、注销、为SSO-Client分配taken、验证taken的工作。

登录和注销采用的是Form认证方式,很多地方都有详细的介绍,我之前也写过一篇文章,想了解的可以去看看:asp.net Forms身份验证详解

SSO-Server分配Token

为SSO-Client分配Token的部分,在SSO-Client请求SSO受信页面的时候,检查SSO-Server是否登录,如果没有登录则跳转到SSO-Server的登录页面,如果已登录,则执行分配Token的代码,在分配完成以后将TokenID作为参数添加到returnUrl中,并跳转到returnUrl,具体的分配代码如下:

if (Domain.Security.SmartAuthenticate.LoginUser != null)
{
    //生成Token,并持久化Token
    Domain.SSO.Entity.SSOToken token = new Entity.SSOToken();
    
    token.User = new Entity.SSOUser();
    token.User.UserName = Domain.Security.SmartAuthenticate.LoginUser.UserName;
    token.LoginID = Session.SessionID;
    Domain.SSO.Entity.SSOToken.SSOTokenList.Add(token);

    //拼接返回的url,参数中带Token
    string spliter = returnUrl.Contains('?') ? "&" : "?";
    returnUrl = returnUrl + spliter + "token=" + token.ID;
    Response.Redirect(returnUrl);
}

当完成Token分配之后,页面将带有TokenID的参数跳转到SSO-Client页面,并在SSO-Client的Cookie中添加Token值,在以后的每次请求中,SSO-Client通过调用SSO-Server的服务来验证Token的合法性。

SSO-Server验证Token

我是通过WebService来验证Token的。

首先在SSO-Server定义一个Web Service:

[WebMethod]
public Entity.SSOToken ValidateToken(string tokenID)
{
    if (!KeepToken(tokenID))
        return null;

    var token = Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m => m.ID == tokenID);
    return token;
}

[WebMethod]
public bool KeepToken(string tokenID)
{
    var token = Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m => m.ID == tokenID);
    if (token == null)
        return false;
    if (token.IsTimeOut())
        return false;

    token.AuthTime = DateTime.Now;
    return true;
}

ValidateToken用来验证TokenID的合法性,KeepToken用来保持Token不会过期。

SSO-Client通过调用Validate验证Token,并得到当前的登录用户信息。接下来看看SSO-Client的实现。

SSO-Client

SSO-Client作为受信系统来存在的,它自己没有认证系统,只能通过SSO-Server来完成用户身份认证的工作。

当用户请求SSO-Client的受保护资源时,SSO-Client会首先是否有TokenID,如果存在TokenID,则调用SSO-Server的WebService来验证这个TokenID是否合法;

验证成功以后将会返回SSOToken的实例,里面包含已登录的用户信息。具体代码如下:

if (!string.IsNullOrEmpty(tokenID))
{
    AuthTokenService.AuthTokenServiceSoapClient client = new AuthTokenService.AuthTokenServiceSoapClient();
    var token = client.ValidateToken(tokenID);
    if (token != null)
    {
        this.lblMessage.Text = "登录成功,登录用户:"
            + token.User.UserName
            + "<a href='http://sso-server.com/logout.aspx?returnUrl="
            + Server.UrlEncode("http://sso-client.com")
            + "'>退出</a>";
    }
    else
    {
        Response.Redirect("http://sso-server.com/sso.aspx?returnUrl=" +
            Server.UrlEncode("http://sso-client.com/default.aspx"));
    }
}
else
{
    Response.Redirect("http://sso-server.com/sso.aspx?returnUrl=" +
        Server.UrlEncode("http://sso-client.com/default.aspx"));
}

源代码

文章中已经介绍了我的具体思路和一些实现,如果你仍然感兴趣,可以下载我的代码>>Demo.SSO

源代码的部署:

1. 在IIS中创建两个站点,分别绑定到SSO-Server和SSO-Client,它们绑定的域名分别是sso-server.com和sso-client.com

2. 在hosts文件中添加两行映射,将sso-server.com和sso-client.com映射到127.0.0.1,确保可以访问

3.访问sso-client.com,这个时候页面将跳转到sso-server.com的登录页面,用户名、密码随便输入,然后点击登录即可

  本文转自http://www.cnblogs.com/youring2/p/sso-practice.html,谢谢楼主的奉献精神

去年的项目开发中遇到了这个问题,也就是系统集成问题,需要用统一的ID来登录多个系统,实现多系统之间的无缝隙链接。

 

CAS实现单点登录(SSO)经典完整教程

一、简介                       1、cas是有耶鲁大学研发的单点登录服务器                       2、本教材所用环境 Tomcat7.2JDK6CAS ...
  • small_love
  • small_love
  • 2011年08月06日 11:01
  • 134877

SSO(单点登录)实现机制讲解

引言          单点登录有许多开发商提供解决方案,本文以yale大学SSO开源项目CAS为例,介绍单点登录实现机制。 术语解释 SSO-Single Sign On,单点登录 TG...
  • yan_dk
  • yan_dk
  • 2011年12月22日 14:16
  • 17532

单点登录(SSO)实现方式(附源码)

原文地址:http://www.cnblogs.com/youring2/p/sso-practice.html SSO的基本概念 SSO英文全称Single Sign On(单点...
  • tanga842428
  • tanga842428
  • 2017年08月22日 16:33
  • 552

cas server sso 单点登录服务端

  • 2014年03月20日 15:37
  • 33.98MB
  • 下载

自己动手写SSO(单点登录)

SSO在我们的应用中非常常见,例如我们在OA系统登录了,我们就可以直接进入采购系统,不需要再登录了,这样使我们非常方便。现在网上也有很多实现方法,于是乎我也想写一个看看。我主要用到的是cookie的机...
  • x1066988452
  • x1066988452
  • 2016年09月19日 20:26
  • 1456

cas 单点登录(SSO)实验之二: cas-client

本文说明如何写一个web服务(cas-study),使用cas-server提供的验证服务。当用户访问这个cas-study服务,会使用上一节的cas-server来验证。为了说明问题,本文使用tom...
  • cheungmine
  • cheungmine
  • 2015年08月07日 15:30
  • 2237

单点登录原理与简单实现

一、单系统登录机制1、http无状态协议  web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关...
  • achuo
  • achuo
  • 2018年01月19日 15:38
  • 51

sso单点登录

sso概念什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分 (即:...
  • qq_30607881
  • qq_30607881
  • 2017年03月22日 16:29
  • 258

SSO单点登录三种情况的实现方式详解

单点登录(SSO——Single Sign On)对于我们来说已经不陌生了。对于大型系统来说使用单点登录可以减少用户很多的麻烦。就拿百度来说吧,百度下面有很多的子系统——百度经验、百度知道、百度文库等...
  • json_ligege
  • json_ligege
  • 2016年06月26日 20:24
  • 2867

使用 CAS 在 Tomcat 中实现单点登录(SSO)

下面内容主要为转载,在自己的尝试搭建的工程中,遇到了问题,部分内容作了调整,主要调整点: 1、用keytool生成证书是,姓名(CN)必须为客户端服务器要访问的域名,域名可以自己随意定,然后在客户端服...
  • yab2012
  • yab2012
  • 2013年06月29日 16:01
  • 1124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单点登录(SSO)的实现方式
举报原因:
原因补充:

(最多只允许输入30个字)