浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)

 更新时间:2021年9月22日 10:05  点击:1788

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的设计思路,我画了一个简单的流程图:

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

SSO-Server

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

登录和注销采用的是Form认证方式,很多地方都有详细的介绍。

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的登录页面,用户名、密码随便输入,然后点击登录即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。 

[!--infotagslink--]

相关文章

  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • R语言实现LASSO回归的方法

    这篇文章主要介绍了R语言实现LASSO回归的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06
  • .net 单点登录的设计与实践

    本篇文章主要介绍了解析.net 单点登录实践,具有一定的参考价值,有需要的可以了解一下。...2021-09-22
  • ASP.NET实现单点登陆(SSO)适用于多种情况

    这篇文章主要介绍了ASP.NET在不同情况下实现单点登陆(SSO)的方法,在同主域但不同子域之间实现单点登陆等等...2021-09-22
  • ASP.NET MVC SSO单点登录设计与实现代码

    本篇文章主要介绍了ASP.NET MVC SSO单点登录设计与实现,具有一定的参考价值,有兴趣的可以了解一下。...2021-09-22
  • 浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)

    这篇文章主要介绍了浅谈谁都能看懂的单点登录(SSO)实现方式(附源码),具有一定的参考价值,有需要的可以了解一下。...2021-09-22
  • 如何在不同.net版本实现单点登录

    经过研究,重写实现了一个可以在不同.net版本中实现单点登录的简单方法。现在和大家分享一下,不足之处还望见谅...2021-09-22
  • asp.net简单实现单点登录(SSO)的方法

    这篇文章主要介绍了asp.net简单实现单点登录(SSO)的方法,结合简单实例形式较为详细的分析了单点登录的原理与asp.net的相关实现技巧,需要的朋友可以参考下...2021-09-22
  • ASP.NET 5中使用AzureAD实现单点登录

    本文给大家介绍的是在ASP.NET 5中使用AzureAD实现单点登录的方法和示例,有需要的小伙伴可以参考下。...2021-09-22
  • 深入浅析C#中单点登录的原理和使用

    这篇文章主要介绍了C#中单点登录的原理和使用,需要的朋友可以参考下...2020-06-25
  • .net core 1.0 实现单点登录负载多服务器

    这篇文章主要介绍了.net core 1.0 实现单点登录负载多服务器的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友可以参考下...2021-09-22
  • 基于.Net的单点登录(SSO)实现解决方案

    SSO的解决方案很多,但搜索结果令人大失所望,大部分是相互转载,并且描述的也是走马观花,本文对此进行详细介绍,需要了解的朋友可以参考下...2021-09-22
  • .NET 单点登录解决方案

    这里指的单点,泛指在WEB服务端,一个账户同一时刻只能存在一个票据!怎么使同一个用户,在同一时间内只允许登录一次,下面将为大家详细介绍下...2021-09-22
  • 详解可跨域的单点登录(SSO)实现方案【附.net代码】

    本篇文章主要介绍了可跨域的单点登录(SSO)实现方案,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • SSO单点登录的PHP实现方法(Laravel框架)

    这篇文章主要介绍了SSO单点登录的PHP实现方法(Laravel框架) 的相关资料,需要的朋友可以参考下...2016-03-27
  • Java spring单点登录系统

    这篇文章主要介绍了Java spring单点登录系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • gtoken替换jwt实现sso登录的排雷避坑

    这篇文章主要为大家介绍了gtoken替换jwt实现sso登录的排雷避坑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2022-06-11
  • SpringBoot单点登录实现过程详细分析

    这篇文章主要介绍了SpringBoot单点登录实现过程,单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统...2022-12-04