谁都能看懂的cas实现单点登录录实现方式

谁都能看懂的单点登录(SSO)实现方式(附源码)
我的图书馆
谁都能看懂的单点登录(SSO)实现方式(附源码)
SSO的基本概念
SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。(本段内容来自百度百科)
今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善!
二级域名的单点登录
什么是二级域名呢?例如:
对于二级域名的单点登录,我们可以非常方便的通过共享cookie来实现,简单的说,就是在设置Form票据的时候,将cookie的domain设置为顶级域名即可,例如:HttpCookie cookie = new HttpCookie(FormsAuthCookieName, encryptedTicket);
cookie.Expires = rememberMe ? expirationDate : DateTime.MinV
cookie.HttpOnly = true;
cookie.Path = "/";
cookie.Domain = "";
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,具体的分配代码如下: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.UserN
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);
[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.N
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='/logout.aspx?returnUrl="
+ Server.UrlEncode("")
+ "'&退出&/a&";
Response.Redirect("/sso.aspx?returnUrl=" +
Server.UrlEncode("/default.aspx"));
Response.Redirect("/sso.aspx?returnUrl=" +
Server.UrlEncode("/default.aspx"));
文章中已经介绍了我的具体思路和一些实现,如果你仍然感兴趣,可以下载我的代码&&
源代码的部署:
1. 在IIS中创建两个站点,分别绑定到SSO-Server和SSO-Client,它们绑定的域名分别是和
2. 在hosts文件中添加两行映射,将和映射到127.0.0.1,确保可以访问
3.访问,这个时候页面将跳转到的登录页面,用户名、密码随便输入,然后点击登录即可
我很认真的完成了这个方案,也感谢你很认真的看完!欢迎拍砖!
TA的最新馆藏VR到底怎么玩?一篇谁都能看懂的VR解读
航空大世界
原始标题:
航空科技融入美好生活!——航空大世界OK,今天我们就来说说科技!如今,说到与科技相关的元素,最火热的毫无疑问就是——!,就是Virtual Reality这两个英文单词的缩写,直接理解也就是,感觉是将两个矛盾的词汇综合在一起,那么到底如何理解比较准确呢?就是一副有点科幻感觉的眼镜?像是这个样子?是游戏机?穿越时空去打怪!好酷是娱乐设备?各种娱乐/游戏展会上,各种各样的设备目不暇接的感觉,就是炫酷的黑科技+前卫的娱乐效果是目前刺激行业火爆的因素所以就是能让我们的游戏机升级??NO!纯这样理解是狭隘的!!最正规的概念解读,应该是:综合利用计算机图形系统和各种现实及控制等接口设备,在计算机上生成的、可交互的三维环境中提供沉浸感觉的技术;计算机生成的、可交互的三维环境成为虚拟环境。读起来有点拗口,听起来有点玄乎?换个说法就很简单:用电脑构建另一个世界!所以,的应用范围是很广的,而不是一部游戏机这么简单与医疗:利用技术构建出真实的人体,进行医疗实验!与工业设计:立体化可互动的设计环境对比以前相对平面的设计环境,当然更有利于设计师进行创作!与城市规划:通过技术虚拟构架出未来城市,对于成本控制和降低投资风险都有莫大的好处!与主题乐园:把的娱乐性扩大化,规模化,将个人娱乐扩展升级成为大型团队娱乐以及文化引导,是未来大型娱乐平台发展的必然趋势!所以,是可能改变世界的技术游戏娱乐只是其中一个方面而已当然,游戏和娱乐,也是很重要的!甚至可以说是当前产业发展中最重要的一环!因为,目前普通大众能够接触到的设备大多还是以游戏娱乐为主要体验的,所以娱乐设备肩负着普及技术的艰巨任务!比如,目前市场上比较成熟的,可以通过普通销售渠道获得并且费用能够承受的产品就是这三个:依次为Oculus Rift、HTC Vive、PlayStation 本着本文浅显易懂的原则,什么参数设置就不提了,分别用一句话来解读就是:Oculus Rift:售价599美元,XBOX ONE手柄作为控制器,需要一台高配PC,软件资源从PC上获取HTC Vive:售价799美元,HTC自主开发控制器,需要一台高配PC,软件资源从PC上获取PlayStation :售价399美元,PS4手柄作为控制器,需要另外购买一台PS4,软件资源从PS4上获取(目前不支持PC)另外,请注意和AR的区别(Virtual Reality&)和AR(Augmented Reality&增强现实)并非同一个概念,但却被很多人混淆,简单来解释,是让你进入一个另外的世界,而AR是让现实的世界变得更加有趣。利用手机屏幕与现实进行互动,这是AR技术,而不是吹了半天,还得说说现状和问题!前沿科技,看起来非常美丽炫酷,但必然会存在很多适应性方面的问题,技术当然也不会例外,虽然目前市场对于吹捧有加,但是对于广大受众来说,是否能够得到完美的体验?是需要探讨的!1、同质化技术和设备目前进入爆发式增涨的阶段,但是其中沉陷的产品却是大同小异,相信很多去过国内设备展会的朋友都有一个感觉,那就是体验一两家之后,基本上就没有什么新鲜的东西可玩。2、概念太强,实体太弱有市场关注,自然就有热钱准备投资,在这样的环境之下,当前很多供应商更多的还是在概念和愿景上做文章,看上去很美,但实际的产品却差强人意,这样的发展趋势,必然加速行业洗牌,对于受众体验也会存在负面。3、重技术,轻内容目前针对产业,更多的还是体现在技术层面,大家都拼硬件配置、技术指标等,但与之对于的内容深度却相对匮乏,更多的设备仅仅只是提供一个的渠道,而没有一种真正的&穿越&感!简而言之,有,还得有IP!2、技术更新,形式没变使用技术,但为什么玩到的还是以前的&水果忍者&?这样的体验相信很多接触过设备的朋友都有过,虽然技术更新了,但娱乐体验的形式却没有跟上,不过是酒瓶换新装。那么,到底的正确打开方式是?新兴的行业虽然展现了强大的技术,但势必要经过市场的洗礼和受众的考验,方兴未艾的现在,很多层面其实是雾里看花水中望月,所以,这个行业更是需要强大的先行者!比如,技术+大型现代博物馆,是否会是一件非常炫酷的事情?作为新时代的博物馆,运用新的科技手段来增强观众对于展览内容的印象已成为一大趋势,曾经,我们只能隔着玻璃罩来观察展品,而现在我们可以通过技术直接穿越到那些激动人心的场景!近年来,国曼彻斯特大都会大学尝试在曼彻斯特美术馆中开发可穿戴讲解设备,并希望将来能够使用眼镜为观众提供推荐和导赏服务。英国的大英博物馆去年夏天与三星公司合作通过技术让游客进入青铜时代!那么,这种炫酷的博物馆,距离我们遥远么?当然不遥远!!成都航空大世界博物馆为打破传统博物馆的展示单一性,利用技术使更多的观众对展览的内容产生兴趣,博物馆分为专题展区、特种影院组团、航空资料室、电子竞技、互动体验。博物馆的核心即专题展厅内,将会穿插机舱影院,发动机台架实验、训练伞架纪录片等与装置结合的视频资料放映,以及各类多媒体互动体验设置,让展览形式变得更加多元化、互动性更高、更拥有带入感。同时,部分展品还会配合增强现实眼镜为观众展示更深入的展品背景探索。《博物馆之夜》的体验,可能会变为现实哦!而且,博物馆仅仅只是航空大世界各种新奇体验的一小部分,这里还有更多炫酷科技与主题娱乐相结合的惊喜,我们未来将会一一公开!期待么?那么,敬请关注 ↓&↓&↓&↓&↓&
VR资源网整理出品权限管理、用户权限系统、开源用户权限系统、信息化建设标准基础数据管理平台
Posts - 764,
Articles - 0,
Comments - 21103
23:52 by 通用C#系统架构, ... 阅读,
&&&有一句话也挺有意思的,一直在模仿但从未超越过,文章里的技术也都是相对简单的技术,但是实实在在能解决问题,提高效率。
&& 现在人都懒得瞎折腾,能多简单就多简单,谁都不希望总是做一些重复的工作,我们反复登录多个系统,其实是很头疼的事情,有的系统设计得很友善,有的系统是很糟糕的,我们总是输入用户名、密码、验证码等有时候输入得都有些头大,若只要登录一个系统就可以顺利快速的登录其它N个系统。而且有统一的消息提醒,统一的审批流程,统一的用户,那就很爽了。
&& 我们平时开发各种系统,尽量让系统支持,各种登录方式,那就会用起来很舒服了。
&& 例如,B/S 的支持URL方式登录系统。C/S系统支持 static void Main(string[] args)参数登录,那就很爽了。
&& C/S 的可以参考 && 接着给大家分享一下,通用权限管理系统组件里是如何实现多个系统的集中统一的入口,只登录一次处处畅通了。
上面是运行效果,可以添加任意多个子系统,而且还可以支持C/S B/S,多种登录参数方式,还可以定制,还可以控制菜单的访问权限,不同的人显示不同的菜单。
&上图是后台的菜单设计器,可以灵活添加多个子系统,可以排序,可以隐藏停用,也可以设置访问权限。
&上图为,传输用户密码的效果,当然还可以按要求传输其他参数,例如工号,用户主键,令牌等等。
&上图是传输令牌的设置方法。
&这个是执行C/S程序的效果,当然后面可以带参数,就可以实现自动登录。
&上图为,自动登录B/S系统的效果图,不需要人工输入用户名密码等等繁琐的步骤进入内部管理系统了。
动态加载菜单的参考代码
&1&&&&&&&&&private&void&AddApplictionsMenuItem(ToolStripMenuItem&mitmAppliction)
&2&&&&&&&&&{
&3&&&&&&&&&&&&&//&判断是否已经加载过菜单了
&4&&&&&&&&&&&&&if&(mitmAppliction.Tag&!=&null)
&5&&&&&&&&&&&&&{
&6&&&&&&&&&&&&&&&&&return;
&7&&&&&&&&&&&&&}
&8&&&&&&&&&&&&&ToolStripMenuItem&mitm&=&null;
&9&&&&&&&&&&&&&string&moduleCode&=&string.E
10&&&&&&&&&&&&&string&id&=&BaseBusinessLogic.GetProperty(ClientCache.Instance.DTMoule,&BaseModuleTable.FieldCode,&"Appliction",&BaseModuleTable.FieldId);
11&&&&&&&&&&&&&if&(string.IsNullOrEmpty(id))
12&&&&&&&&&&&&&{
13&&&&&&&&&&&&&&&&&return;
14&&&&&&&&&&&&&}
15&&&&&&&&&&&&&//&从所有的系统菜单里进行循环
16&&&&&&&&&&&&&foreach&(DataRow&dataRow&in&ClientCache.Instance.DTMoule.Select(BaseModuleTable.FieldParentId&+&"="&+&id.ToString()))
17&&&&&&&&&&&&&{
18&&&&&&&&&&&&&&&&&//&判断有些特殊的处理,跳过
19&&&&&&&&&&&&&&&&&moduleCode&=&dataRow[BaseModuleTable.FieldCode].ToString();
20&&&&&&&&&&&&&&&&&if&(string.IsNullOrEmpty(moduleCode)&||&moduleCode.Equals("FrmBusinessCardAdmin")&||&moduleCode.Equals("FrmCodeGenerator"))
21&&&&&&&&&&&&&&&&&{
22&&&&&&&&&&&&&&&&&&&&&continue;
23&&&&&&&&&&&&&&&&&}
24&&&&&&&&&&&&&&&&&//&是否显示的,是否有权限的,才可以访问菜单
25&&&&&&&&&&&&&&&&&if&(this.ModuleIsVisible(moduleCode)&&&&this.IsModuleAuthorized(moduleCode))
26&&&&&&&&&&&&&&&&&{
27&&&&&&&&&&&&&&&&&&&&&id&=&dataRow[BaseModuleTable.FieldId].ToString();
28&&&&&&&&&&&&&&&&&&&&&mitm&=&new&ToolStripMenuItem(dataRow[BaseModuleTable.FieldFullName].ToString());
29&&&&&&&&&&&&&&&&&&&&&mitm.Name&=&"mitmUrl"&+&
30&&&&&&&&&&&&&&&&&&&&&mitm.Tag&=&dataRow[BaseModuleTable.FieldNavigateUrl].ToString();
31&&&&&&&&&&&&&&&&&&&&&mitm.Click&+=&mitm_C
32&&&&&&&&&&&&&&&&&&&&&mitmAppliction.DropDownItems.Add(mitm);
33&&&&&&&&&&&&&&&&&}
34&&&&&&&&&&&&&}
35&&&&&&&&&&&&&//&打上已经加载菜单的标志,提高程序效率不反复执行程序
36&&&&&&&&&&&&&mitmAppliction.Tag&=&"Url";
37&&&&&&&&&}
打开指定网页程序的参考代码
&1&&&&&&&&&private&void&mitm_Click(object&sender,&EventArgs&e)
&2&&&&&&&&&{
&3&&&&&&&&&&&&&//&这里是获取表单的名称
&4&&&&&&&&&&&&&string&formName&=&((ToolStripMenuItem)sender).Name.Substring(4);
&5&&&&&&&&&&&&&//&这里是获取命名空间
&6&&&&&&&&&&&&&string&assemblyName&=&BaseSystemInfo.MainA
&7&&&&&&&&&&&&&if&(((ToolStripMenuItem)sender).Tag&!=&null)
&8&&&&&&&&&&&&&{
&9&&&&&&&&&&&&&&&&&assemblyName&=&((ToolStripMenuItem)sender).Tag.ToString();
10&&&&&&&&&&&&&}
11&&&&&&&&&&&&&if&(formName.Substring(0,3).Equals("Url"))
12&&&&&&&&&&&&&{
13&&&&&&&&&&&&&&&&&string&url&=&assemblyN
14&&&&&&&&&&&&&&&&&if&(!string.IsNullOrEmpty(url))
15&&&&&&&&&&&&&&&&&{
16&&&&&&&&&&&&&&&&&&&&&url&=&url.Replace("{UserCode}",&this.UserInfo.Code);
17&&&&&&&&&&&&&&&&&&&&&url&=&url.Replace("{UserName}",&this.UserInfo.UserName);
18&&&&&&&&&&&&&&&&&&&&&url&=&url.Replace("{Password}",&this.UserInfo.Password);
19&&&&&&&&&&&&&&&&&&&&&url&=&url.Replace("{UserId}",&this.UserInfo.Id);
20&&&&&&&&&&&&&&&&&&&&&url&=&url.Replace("{OpenId}",&this.UserInfo.OpenId);
21&&&&&&&&&&&&&&&&&&&&&System.Diagnostics.Process.Start(url);
22&&&&&&&&&&&&&&&&&}
23&&&&&&&&&&&&&&&&&return;
24&&&&&&&&&&&&&}
25&&&&&&&&&&&&&//&这里是加载窗体,不会重复加载窗体
26&&&&&&&&&&&&&this.LoadChildrenForm(assemblyName,&formName,&true);
27&&&&&&&&&}
C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权
欢迎注册蒙古人交友网站,

我要回帖

更多关于 shiro实现单点登录 的文章

 

随机推荐