关于跨域名实现单点登录的问题。请大侠来帮忙看看

问题描述

有这样一个需求,www.sitea.com.cn和www.siteb.com.cn两个不同域名的网站,2个网站使用一个数据库中的用户表,要求在www.sitea.com.cn中登录后在www.siteb.com.cn中也是登录状态。。在网上找了一天,找到如下解决方案。。帖子地址如下:http://www.cnblogs.com/AndersLiu/archive/2007/06/20/790894.html我是想问。。5.不同域之众的两个应用之间的SSO下的第二段代码该放在哪里?我放在Global.cs的Application_BeginRequest事件下运行是会报错,是因为Request.UrlReferrer为NULL,不知道是不是该代码不是放在此事件中呢,盼大侠指点

解决方案

解决方案二:
环境:vs.net2005sp1
解决方案三:
【原创】ASP.NET安全认证(四)——巧妙实现Form表单认证跨站点、跨服务器的单点登录(SingleSignOn)作者:寒羽枫(cityhunter172)第四部分Form认证的补充前三篇在CSDN论坛公布后,效果如同“神仙放屁——果然不同凡(反)响”。为感谢广大网友的热情与支持,这不,经过这一阵子的酝酿、修炼,特意准备了这第四响。之前我们讲述的使用Form认证实现单点登录,正如网友所说的那样,只能在同一域名下使用。对于跨域名的单点登录,除了使用Passport认证外,我们还是可以用Form认证的,只是要讲究方法而已啦。正所谓“山不转水转,人不转心转”。一、跨域名的解决思路在MSDN2003上搜索关键字“Passport”,偶找到一篇“Passport身份验证提供程序”。文章讲述了Passport的认证原理,共8条,我就不多说了,大伙自个看吧。其中有一句话,引起偶的注意:“……响应在查询字符串中包含一个加密的PassportCookie……”。也正是此句才有了下面的思路。所谓认证的通过与否,其实质就是检测有无发放有效的Cookie,使用Form也好,运用Passport也罢,都是Cookie在起作用。也就是说,我们只要把有效的Cookie在登录后一次性发放给客户端就得了。二、跨域名、跨服务器的单点登录方法1、如何在本机模拟跨域名、跨服务器的SingleSignOn只要浏览网址不同就相当于不同域名,在本机至少有以下三种。它们虽然是同一项目,彼此却不能共用Session与Cookie,也就无法共享身份验证票:a).http://localhost/FormTest/Login.aspxb).http://127.0.0.1/FormTest/Login.aspxc).http://My_Computer_Name/FormTest/Login.aspx//以电脑名称浏览站点d).http://192.168.0.8/FormTest/Login.aspx//以网卡地址浏览站点e).http://172.meibu.com/FormTest/Login.aspx//拥有国际域名2、在ASP.NET中如何提交给其它页面用过ViewState的大概都知道,ViewState是保存在客户端的。不知大伙注意没有,ASP.NET为每张.aspx页面都配备了独自的ViewState,且被解析后都是以一个name="__VIEWSTATE"的隐藏控件值来保存ViewState。每次页面提交,服务器都会检查该控件的值有无被篡改,如此一来就注定.aspx只能提交给本页。服务器是死的,人是活的,我们不能被这些条条框框限定死了,我们要把程序写成活的。下面咱们从http://localhost/FormTest/Login.aspx输入用户名与密码,然后提交给http://127.0.0.1/FormTest/Public/LoginTransfer.aspx。Login.aspx与LoginTransfer.aspx都包含用户名输入框一个、密码输入框一个、登录按钮一个。在Login.aspx页面加入以下代码:this.Btn_Login.Attributes["onclick"]="SingleSignOn()";//指定执行脚本事件在Login.aspx页面上插入以下脚本:<scriptlanguage="javascript">functionSingleSignOn(){//只能用脚本改变指定Form提交的对象document.getElementById("Form1").action="http://127.0.0.1/FormTest/Public/LoginTransfer.aspx?FromUrl="+window.location.href;//把隐藏控件__VIEWSTATE中的值变更为LoginTransfer.aspx解析后出现的值,以实际看到的值为准document.all.__VIEWSTATE.value="dDwtMTkyODUzMTMyNzs7Pv1cp2RaxUcr5hGYf8ILX9/EMKy8";}</script>注意事项a).LoginTransfer.aspx出现的控件及其ID,必须能够在Login.aspx找到b).控件的ID必须一致,且能一一对应c).关于__VIEWSTATE中的值,它与页面控件ID无关,与浏览该页面的网址无关,目前我只知道和控件的数量、类型、名字空间(namespaceFormTest.Public)以及存在的ViewState有关系。大家在测试时,以直接浏览http://127.0.0.1/FormTest/Public/LoginTransfer.aspx后,查看页面源文件所看到的值为准。d).提交后,将触发并执行LoginTransfer.aspx中的Btn_Login_Click事件3、基本思路各个站点的登录页面统一将用户名与密码提交给LoginTransfer.aspx,同时各个站点需要一个增加Cookie的页面,用于将加密后的身份验证Cookie添加至客户端。此乃经过一番考量后,最终确定的可行性方案。4、第一种思路——天女散花何谓天女散花,就是把Cookie在登录后一次性全发放出去,就如同天仙在空中散花一样,场面是何等的壮观。下面开始写代码:为更好的区分,我们将负责添加Cookie的页面分开命名:a).http://localhost/FormTest/Public/AddCookie_A.aspxb).http://127.0.0.1/FormTest/Public/AddCookie_B.aspxc).http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx这三张页面的功能一样,所以代码也就相同啰privatevoidPage_Load(objectsender,System.EventArgse){stringfrom=Request["FromUrl"];//起始URL路径stringnext=Request["NextUrl"];//还需要跳转的URLstringkey=Request["CookieTicket"];//已加密的Cookie文本if(key!=null&&key!=""){System.Web.HttpCookieck=newHttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key);ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath;ck.Expires=System.DateTime.Now.AddYears(100);Response.Cookies.Add(ck);//将传过来的已加密的身份验证票添加至客房端stringurl=next.Split(';')[0];//从URL中拆分出将要跳转的下一张页面next=next.Replace(url+";","");//带入下一轮跳转的字串if(url!=""){//跳至下一页面Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next);}else//已没有下一页面可供跳转{Response.Redirect(from);//回到起始页面}}}接下来编写LoginTransfer.aspx的代码://页面常量allLoginUrl存放所有站点的AddCookie.aspx的URL,注意以;分隔publicconststringallLoginUrl="http://localhost/FormTest/Public/AddCookie_A.aspx;"+"http://127.0.0.1/FormTest/Public/AddCookie_B.aspx;"+"http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx;";偶已在上面讲述了,如何点击Login.aspx中的登录按钮Btn_Login将用户名与密码提交给LoginTransfer.aspx,并执行LoginTransfer.aspx中的Btn_Login_Click事件。privatevoidBtn_Login_Click(objectsender,System.EventArgse){
解决方案四:
【原创】ASP.NET安全认证(四)——巧妙实现Form表单认证跨站点、跨服务器的单点登录(SingleSignOn)作者:寒羽枫(cityhunter172)第四部分Form认证的补充前三篇在CSDN论坛公布后,效果如同“神仙放屁——果然不同凡(反)响”。为感谢广大网友的热情与支持,这不,经过这一阵子的酝酿、修炼,特意准备了这第四响。之前我们讲述的使用Form认证实现单点登录,正如网友所说的那样,只能在同一域名下使用。对于跨域名的单点登录,除了使用Passport认证外,我们还是可以用Form认证的,只是要讲究方法而已啦。正所谓“山不转水转,人不转心转”。一、跨域名的解决思路在MSDN2003上搜索关键字“Passport”,偶找到一篇“Passport身份验证提供程序”。文章讲述了Passport的认证原理,共8条,我就不多说了,大伙自个看吧。其中有一句话,引起偶的注意:“……响应在查询字符串中包含一个加密的PassportCookie……”。也正是此句才有了下面的思路。所谓认证的通过与否,其实质就是检测有无发放有效的Cookie,使用Form也好,运用Passport也罢,都是Cookie在起作用。也就是说,我们只要把有效的Cookie在登录后一次性发放给客户端就得了。二、跨域名、跨服务器的单点登录方法1、如何在本机模拟跨域名、跨服务器的SingleSignOn只要浏览网址不同就相当于不同域名,在本机至少有以下三种。它们虽然是同一项目,彼此却不能共用Session与Cookie,也就无法共享身份验证票:a).http://localhost/FormTest/Login.aspxb).http://127.0.0.1/FormTest/Login.aspxc).http://My_Computer_Name/FormTest/Login.aspx//以电脑名称浏览站点d).http://192.168.0.8/FormTest/Login.aspx//以网卡地址浏览站点e).http://172.meibu.com/FormTest/Login.aspx//拥有国际域名2、在ASP.NET中如何提交给其它页面用过ViewState的大概都知道,ViewState是保存在客户端的。不知大伙注意没有,ASP.NET为每张.aspx页面都配备了独自的ViewState,且被解析后都是以一个name="__VIEWSTATE"的隐藏控件值来保存ViewState。每次页面提交,服务器都会检查该控件的值有无被篡改,如此一来就注定.aspx只能提交给本页。服务器是死的,人是活的,我们不能被这些条条框框限定死了,我们要把程序写成活的。下面咱们从http://localhost/FormTest/Login.aspx输入用户名与密码,然后提交给http://127.0.0.1/FormTest/Public/LoginTransfer.aspx。Login.aspx与LoginTransfer.aspx都包含用户名输入框一个、密码输入框一个、登录按钮一个。在Login.aspx页面加入以下代码:this.Btn_Login.Attributes["onclick"]="SingleSignOn()";//指定执行脚本事件在Login.aspx页面上插入以下脚本:<scriptlanguage="javascript">functionSingleSignOn(){//只能用脚本改变指定Form提交的对象document.getElementById("Form1").action="http://127.0.0.1/FormTest/Public/LoginTransfer.aspx?FromUrl="+window.location.href;//把隐藏控件__VIEWSTATE中的值变更为LoginTransfer.aspx解析后出现的值,以实际看到的值为准document.all.__VIEWSTATE.value="dDwtMTkyODUzMTMyNzs7Pv1cp2RaxUcr5hGYf8ILX9/EMKy8";}</script>注意事项a).LoginTransfer.aspx出现的控件及其ID,必须能够在Login.aspx找到b).控件的ID必须一致,且能一一对应c).关于__VIEWSTATE中的值,它与页面控件ID无关,与浏览该页面的网址无关,目前我只知道和控件的数量、类型、名字空间(namespaceFormTest.Public)以及存在的ViewState有关系。大家在测试时,以直接浏览http://127.0.0.1/FormTest/Public/LoginTransfer.aspx后,查看页面源文件所看到的值为准。d).提交后,将触发并执行LoginTransfer.aspx中的Btn_Login_Click事件3、基本思路各个站点的登录页面统一将用户名与密码提交给LoginTransfer.aspx,同时各个站点需要一个增加Cookie的页面,用于将加密后的身份验证Cookie添加至客户端。此乃经过一番考量后,最终确定的可行性方案。4、第一种思路——天女散花何谓天女散花,就是把Cookie在登录后一次性全发放出去,就如同天仙在空中散花一样,场面是何等的壮观。下面开始写代码:为更好的区分,我们将负责添加Cookie的页面分开命名:a).http://localhost/FormTest/Public/AddCookie_A.aspxb).http://127.0.0.1/FormTest/Public/AddCookie_B.aspxc).http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx这三张页面的功能一样,所以代码也就相同啰privatevoidPage_Load(objectsender,System.EventArgse){stringfrom=Request["FromUrl"];//起始URL路径stringnext=Request["NextUrl"];//还需要跳转的URLstringkey=Request["CookieTicket"];//已加密的Cookie文本if(key!=null&&key!=""){System.Web.HttpCookieck=newHttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key);ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath;ck.Expires=System.DateTime.Now.AddYears(100);Response.Cookies.Add(ck);//将传过来的已加密的身份验证票添加至客房端stringurl=next.Split(';')[0];//从URL中拆分出将要跳转的下一张页面next=next.Replace(url+";","");//带入下一轮跳转的字串if(url!=""){//跳至下一页面Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next);}else//已没有下一页面可供跳转{Response.Redirect(from);//回到起始页面}}}接下来编写LoginTransfer.aspx的代码://页面常量allLoginUrl存放所有站点的AddCookie.aspx的URL,注意以;分隔publicconststringallLoginUrl="http://localhost/FormTest/Public/AddCookie_A.aspx;"+"http://127.0.0.1/FormTest/Public/AddCookie_B.aspx;"+"http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx;";偶已在上面讲述了,如何点击Login.aspx中的登录按钮Btn_Login将用户名与密码提交给LoginTransfer.aspx,并执行LoginTransfer.aspx中的Btn_Login_Click事件。privatevoidBtn_Login_Click(objectsender,System.EventArgse){
解决方案五:
stringfrom=Request["FromUrl"];//起始URL路径stringnext=this.allLoginUrl;//由于控件ID相同,所以此处得到的是由Login.aspx提交过来的用户名与密码if(this.Txt_LoginName.Text=="Admin"&&this.Txt_Password.Text=="123456"){System.Web.Security.FormsAuthenticationTickettk=newSystem.Web.Security.FormsAuthenticationTicket(1,"Admin",System.DateTime.Now,System.DateTime.Now.AddYears(100),false,"测试用户数据");stringkey=System.Web.Security.FormsAuthentication.Encrypt(tk);//得到加密后的身份验证票字串stringurl=next.Split(';')[0];//从URL中拆分出将要跳转的下一张页面next=next.Replace(url+";","");//带入下一轮跳转的字串Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next);//跳至下一页面}}5、第二种思路——后羿射日后羿射日,意思指的是用户点哪就跳哪。他若是点“火坑”,你也得往里跳,因为用户是上帝嘛。我们增加一个通行证页面MyPassport.aspx,由http://127.0.0.1/FormTest/Public/LoginTransfer.aspx发放验证Cookie后直接跳转至http://127.0.0.1/FormTest/MyPassport.aspx。不要告诉我你不会,你要是真不会,那偶也没法子啦,还得请你回头看看,偶在第三篇是如何讲述发放永久性验证Cookie吧(http://blog.csdn.net/cityhunter172/archive/2005/12/06/545301.aspx)。还需要一张用作跳板的跳转页面MyTransfer.aspx。MyPassport.aspx的代码:<atarget="_blank"href="MyTransfer.aspx?goto=http://localhost/FormTest/Public/AddCookie_D.aspx">美丽的天使</a><atarget="_blank"href="MyTransfer.aspx?goto=http://127.0.0.1/FormTest/Public/AddCookie_E.aspx">快乐的天堂</a><atarget="_blank"href="MyTransfer.aspx?goto=http://My_Computer_Name/FormTest/Public/AddCookie_F.aspx">大大的火坑</a>MyTransfer.aspx的代码:privatevoidPage_Load(objectsender,System.EventArgse){//获取身份验证票System.Web.Security.FormsAuthenticationTickettk=((System.Web.Security.FormsIdentity)User.Identity).Ticket;stringkey=System.Web.Security.FormsAuthentication.Encrypt(tk);//每次加密后的字串都是不同的stringnext=Request["goto"];//将要跳转的URLResponse.Redirect(url+"?CookieTicket="+key);//跳转至下一页面}AddCookie_D.aspx、AddCookie_E.aspx、AddCookie_F.aspx这三张页面的代码:stringkey=Request["CookieTicket"];//已加密的Cookie文本if(key!=null&&key!=""){System.Web.HttpCookieck=newHttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key);ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath;ck.Expires=System.DateTime.Now.AddYears(100);Response.Cookies.Add(ck);//将传过来的已加密的身份验证票添加至客房端Response.Redirect("../Index.aspx");//跳转至你真正想带客户去的地方}6、点评两者共同点:a).每个站点都需要一个登录的提交点、一张添加Cookie的页面。b).因为只能靠发放验证Cookie来识别身份,所以一台电脑不能同时登录两个帐号。c).都存在不同程度的安全隐患。两者不同点:(天女散花以下简称“开女”,后羿射日就简称“后羿”)a).天女一次性发放Cookie,如果站点较多,处理起来还是需要一些时间的。而后羿则相反,站点再多也不怕。b).天女在散花的过程中,如果中途被卡住,则需要一个错误处理机制做回退处理。后羿则不需要。c).天女在登录后可以直接在IE地址浏览其想看的站点;而后羿则必须从通行证的跳板页面进入才行。根据上述问题,给几点建议:a).不要使用永久性Cookie,应指明身份验证票的过期时间,注意不是Cookie的有效期。b).在身份验证票的UserData中加入其它的验证信息或存放用户IDc).在网络通畅的情况下,比如局域网,站点又相对较少,建议选用天女。50个站点之间做跳转应该不会超过10秒(前提是已编译好了,且不是初次访问)。三、跨域名、跨服务器的退出方法只要理解了“天女散花”,退出就比较容易啦。为每个站点准备一个用于退出的页面,如下:a).http://localhost/FormTest/Public/Logout.aspxb).http://127.0.0.1/FormTest/Public/Logout.aspxc).http://My_Computer_Name/Public/FormTest/Logout.aspxprivatevoidPage_Load(objectsender,System.EventArgse){System.Web.Security.FormsAuthentication.SignOut();//删除Cookie中的身份验证票stringfrom=Request["FromUrl"];stringnext=Request["NextUrl"];stringurl=next.Split(';')[0];next=next.Replace(url+";","");if(url!=""){Response.Redirect(url+"?FromUrl="+from+"&NextUrl="+next);}else{Response.Redirect(from);}}对啦,还有一张LogoutTransfer.aspx.,代码偶就不写,大家自个完成吧。寒羽枫(cityhunter172)2005-12-3118:22完稿
解决方案六:
转的帖子,自己慢慢看吧
解决方案七:
Mark一下...方便以后寻找
解决方案八:
这个好像不怎么合适,我的登录界面是做成用户控件的。。在很多页面都有。。。。。
解决方案九:
那你去百度下吧,根据你的需求,我是根据你提出的问题去百度的。
解决方案十:
我就是去百度了啊找到如下帖子。。http://www.cnblogs.com/AndersLiu/archive/2007/06/20/790894.html但是不知道怎么用
解决方案十一:
理解原理了以后就好做了....单点登陆有很多种解决方案..
解决方案十二:
提供一种思路,通过序列化、反序列化的机制实现,详细如下:http://blog.csdn.net/lxjhb/archive/2007/11/10/1877398.aspx

时间: 2024-10-25 21:24:20

关于跨域名实现单点登录的问题。请大侠来帮忙看看的相关文章

java跨域名的单点登录

问题描述 java跨域名的单点登录 如题,我在网上看到的说有用cookie的,还有用什么协议的,我不知道该从哪一个方向入手,求大神给一个思路 解决方案 有很多开源的就可以直接使用,如cas 解决方案二: Java单点登录java之单点登录java实现单点登录

终端回车不能换行-Linux 系统裁剪之后 终端登录问题!请Linux高手帮忙解决一下!

问题描述 Linux 系统裁剪之后 终端登录问题!请Linux高手帮忙解决一下! 10C 最近裁了一个linux系统 最后能正常启动和运行,唯独的一点遗憾就是tty1 这个终端不能用!以下的不正常信息,在其它tty[2-6]都正常.当登录上tty1之后输入的内容都不会显示!假如输入错误的命令后,回车会显示命令找不到并且会换行!如果直接输入回车,也不能换行,是怎么回事儿? 解决方案 http://blog.csdn.net/ssmile/article/details/8239612

详解可跨域的单点登录(SSO)实现方案【附.net代码】_实用技巧

SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否为空,为空的话跳转到登录界面登录,不为空的话允许访问.  单点登录是一种多站点共享登录访问授权机制,访问用户只需要在一个站点登录就可以访问其它站点需要登录访问的资源(url).用户在任意一个站点注销登录,则其它站点的登录状态也被注销.简而言之就是:一处登录,处处登录.一处注销,处处注销. 应用场景:

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

SSO的基本概念 SSO英文全称Single Sign On(单点登录).SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一.(本段内容来自百度百科) 今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善! 二级域名的单点登录 什么是二级域名呢?例如: site1.domain.com site2.domai

互联网上的单点登录研究

随着互联网络应用的普及,越来越多的人开始使用互联网上提供的服务.然而目前提供服务的网站大多采用用户名.口令的方式来识别用户身份,这使得用户 需要经常性的输入自己的用户名.口令.显然这种认证方式存在着弊端:随着用户网络身份的增多,用户相应的需要记忆多组用户名.口令,这给用户造成记忆上的 负担;另外频繁的输入用户名.口令,会相应的增大用户的口令密码被破解的机率.为了改变这一现状,单点登录技术应运而生.单点登录技术的核心思想是通过一 定的方式使得各提供服务的网站之间建立某种联系,用户只需要在其中一个认

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

SSO的基本概念 SSO英文全称Single Sign On(单点登录).SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一.(本段内容来自百度百科) 今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善! 二级域名的单点登录 什么是二级域名呢?例如: site1.domain.com site2.domai

.net cas 单点登录 求助

问题描述 .net cas 单点登录 求助 本人花了一个多星期找资料+测试,还是实现不了这个单点登录功能.请csdn网友出手相助 外部单点登录网址:http://59.41.39.98:808/CAS_Server/login 登录帐号与密码:0166166 123456 功能描述:1.在一个自己开发的网站登录界面,输入帐号密码,实现单点登录. 2.如果1无法实现,那在打开单点登录网址,输入帐号密码登录成功后能返回本网站页面. PS:需要是.net开发的,如果有完整可用的样例源码最好,感谢..

单点登录总结(域名内与跨域名)

多系统情况下经常需要进行单点登录,分为: 1.域名内系统间的单点登录      域名内指一级域名一致.由于cookie会共享,所以登录ID存到cookie中,各系统可从cookie中直接取到登录ID.      通过账户子系统登录后,会生成一个登录ID(绑定userId),这时可以将登录用户信息加密存到cooike中,或者存到redis中(可模拟HttpSession类编写session对象从redis中的存储与读取),账户子系统也可以开放出接口供其它子系统调用登录用户信息. 2.跨域名系统间的

集中权限管理系统-java 跨域单点登录结合集中权限管理 权限控制采用shiro

问题描述 java 跨域单点登录结合集中权限管理 权限控制采用shiro 这种需求的系统谁做过 之前 参考了 网上博客的 oauth2 但是发现不太符合我这个需求 因为oauth2只是授权 并不能解决 登录集中权限系统后 登录其他网站的问题 现在的需求是 用户权限系统只需要一个系统来 维护其他系统 没有用户系统 统一先通过集中权限系统登录后进行用户角色权限维护 如果先登录其他系统这跳转到集中权限系统进行先登录 而且也不能解决集中权限管理的问题 我想过可能需要redis来 实现这功能 但是 总感觉