- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
SSO的基本概念 。
SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。(本段内容来自百度百科) 。
今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善! 。
二级域名的单点登录 。
什么是二级域名呢?例如:
对于二级域名的单点登录,我们可以非常方便的通过共享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就可以实现身份的验证.
但是,当跨域的时候,例如:
这个时候就不能共享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,具体的分配代码如下:
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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
十,Spring Boot 的内容协商的详细剖析(附+Debug调试说明) @ 目录 十,Spring Boot 的内容协商的详细剖析(附+Debug调试说明) 1. 基本
八,SpringBoot Web 开发访问静态资源(附+详细源码剖析) @ 目录 八,SpringBoot Web 开发访问静态资源(附+详细源码剖析) 1. 基本介绍
在sql语句执行前 DB::enableQueryLog(); sql sql sql sql sql dd(DB::getQueryLog()); ?
本文实例讲述了PHP global全局变量的使用与注意事项。分享给大家供大家参考,具体如下: 使用global在方法里面声明外部变量为全局变量,即可以调用该变量。 示例1. global基本用法
SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前sessio
性能测试,在编写代码后,单元测试及性能测试是重要的验收点,好的性能测试可以让我们提前发现程序中存在的问题。 测试用例 在Rust中,测试通常有两部分,一部分是文档测试,一部分是模块测试。 通常我们
我正在制作一个非常简单的应用程序,它有一个输入框和一个按钮。 Input 用于输入email 使用事件处理器订阅按钮 输入电子邮件并点击按钮将进行 api 调用,(此方法有效) subscribe
我正在制作一个非常简单的应用程序,它有一个输入框和一个按钮。 Input 用于输入email 使用事件处理器订阅按钮 输入电子邮件并点击按钮将进行 api 调用,(此方法有效) subscribe
一个星期以来,我一直在努力寻找如何做到这一点,但一直无法做到。我的 html 导航栏看起来像这样。
我们经常在程序设计中用到的数组,同样在脚本中很常用。本节就详细介绍一下数组,以及哈希表在PowerShell中的使用。 数组 在PowerShell中,声明一个变量为数组时,需要使用符号&quo
方法一:先查询出所有记录,然后在逻辑层转化为拼音首字母后查询,显然傻瓜才会这么做。 方法二:在需要搜索的表中添加一个字段用于存放被检索字段内容对应的拼音,在搜索的时候同时去查询这两个字
intellij idea2021是一款java开发神器,功能丰富好用,本文提供其安装包、破解版、补丁、绿色版、激活码等下载,手把手教大家完美安全永久安装破解,亲测绝对可以永久激活。 此方法支持所有的
我在构建一个网站时遇到了一个问题,即我的 h1 内容与我的导航栏重叠。我在 css 中使用了 margin-top 标签,但它不起作用。
前言 时隔2年.(PS:其实陆陆续续在优化,不过没发博客).. .本组件又迎来了新的更新... 很久没更新博客了.生了娃,换了工作单位,太忙了..实在抱歉 NE
为什么 CLGeocoder reverseGeocodeLocation 在查找地址时返回具有不同纬度/经度的地标? 背景:就用户在 map 上“长按”以放置图钉而言,但我的代码对此进行了反向地理编
我是一名优秀的程序员,十分优秀!