gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

SSO的基本概念 。

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

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

二级域名的单点登录 。

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

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

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

?
1
2
3
4
5
6
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分为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,具体的分配代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[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的实例,里面包含已登录的用户信息。具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 。

最后此篇关于浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)的文章就讲到这里了,如果你想了解更多关于浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com