单点登录在项目中的实现 转.

最近在做一个登录功能,纠结了好几天,一直在找一个能优雅的实现单点登录的功能。博客园有看到某人写了又臭又长的八股文式的文章,没看到有价值的东西。

其实单点登录最终要解决的是多个不同域名间共享cookie的问题。但是要在不同域名间共享cookie是一件很困难的事情,要在某个域名下面种cookie就必须访问该

域名。网上有很多方法,看到的有动态创建iframe实现,在iframe里面访问某个域名的页面种下cookie,该方法需要写一些js代码,写起来有点累,所以我最终

选择了用页面跳转来实现,想不到效果比我预期的好很多,浏览器几乎看不出来有跳转的痕迹。

详细介绍下流程:

1. 项目有3个不同的域名,login.susucms.com, suhow.com, sigcms.com。其中login.susucms.com/login.aspx是登录页面。实现的功能是通过login.susucms.com/login.aspx登录后能够实现在访问其他域名也可以保持登录状态。

2. 在suhow.com和sigcms.com下分别添加一个sso.aspx的页面。

3. 当用户在login.susucms.com/login.aspx页面点击登录,服务器端通过验证后生成一个token,接着服务器端Response.Redirect到suhow.com/sso.aspx,suhow.com/sso.aspx立即验证这个token是否合法,如果合法则Reponse一个包含登录信息的cookie,然后Response.Redirect到sigcms.com/sso.aspx,sigcms.com/sso.aspx也验证这个token是否合法,如果合法则Reponse一个包含登录信息的cookie,然后销毁token,Response.Redirect到登录后的后台。

整个流程最核心的其实就是跳转。没有其他的了。经过测试,服务器端响应非常快,几乎感觉不到任何跳转,所以再多跳转几个域名,我想是没有什么大问题的。

简单代码:

1. login.susucms.com/login.aspx

view sourceprint?
01if (IsLogin)
02{
03    var login = new CrossDomainLogin
04    {
05        Key = Guid.NewGuid().ToString(),
06        CreateTime = DateTime.Now
07    };
08    DataContext.CrossDomainLogins.InsertOnSubmit(login);
09    DataContext.SubmitChanges();
10  
11    WriteAuthenticationCookie();
12    Response.Redirect("http://suhow.com/sso.aspx?key=" + login.Key);
13}

2. suhow.com/sso.aspx

view sourceprint?
01var key = Request.QueryString["key"];
02var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
03if (login != null)
04{
05    // key will be expired in 3 minutes
06    if (DateTime.Now.Minute - login.DateTime.Minute > 3)
07    {
08        RemoveKey(login);   // delete key from database
09        Response.Redirect("http://login.susucms.com/login.aspx");
10    }
11    else
12    {
13        WriteAuthenticationCookie();
14        Response.Redirect("http://sigcms.com/sso.aspx?key=" + login.Key);
15    }
16}
17else
18{
19    // ....
20}

3. sigcms.com/sso.aspx

view sourceprint?
01var key = Request.QueryString["key"];
02var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
03if (login != null)
04{
05    // key will be expired in 3 minutes
06    if (DateTime.Now.Minute - login.DateTime.Minute > 3)
07    {
08        RemoveKey(login);   // delete key from database
09        Response.Redirect("http://login.susucms.com/login.aspx");
10    }
11    else
12    {
13        WriteAuthenticationCookie();
14        RemoveKey(login);   // delete key from database
15     Response.Redirect("http://login.susucms.com/admin/default.aspx");
16    }
17}
18else
19{
20    // ....
21}
============================================================================================================
2208516
回复 引用 查看   
#1楼 2011-09-27 00:25 willerce      
可以用js的方式调用各个域名。
可以生成cookie。
跳转的方式在域名多的时候,问题就出来了,并且扩展性不好。
回复 引用 查看   
#2楼 2011-09-27 08:27 豫风      
验证端用cache保存登录信息,其它站点使用session保存登录标志,其它站点每一个页面都继承一个基类(带验证功能的)。使用服务验证
回复 引用 查看   
#3楼 2011-09-27 08:32 Hunt      
又臭又长的八股文,哈哈,了解
回复 引用 查看   
#4楼 2011-09-27 08:53 allentranks      
为啥不用iframe?
还得一个一个跳转?
回复 引用 查看   
#5楼 2011-09-27 08:56 鹤冲天      
跨应用程序进行 Forms 身份验证:ASP.NET 支持在分布式环境中(跨单个服务器上的多个应用程序或在网络场中)进行 Forms 身份验证...
http://msdn.microsoft.com/zh-cn/library/eb0zx8fc.aspx
回复 引用 查看   
#6楼 2011-09-27 09:03 HoYO      
看不出来你跳转 是因为你本机测试 速度当然块了 要是网速慢点的 你跳来跳去 用户就迷茫了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

趣图:程序员桌面对比,iOS vs 安卓

程序员桌面对比,iOS vs 安卓↓↓↓数据与算法之美用数据解决不可能长按扫码关注

如何在 ASP.Net Core 中使用 HTTP.sys WebServer ?

ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,大家都知道 Kestrel 是 ASP.Net Core 内置的跨平台web服务器,但是它有一定的局限性,比如不支持 端口共享 , WebSockets…

php图片上传 thinkphp5,thinkphp5图片上传接口

public function avatarUpload(){$file request()->file(‘file‘);$filePath ‘avatar‘;$width 200;$height 200;if($file){$filePaths ROOT_PATH . ‘public‘ . DS . ‘uploads‘ . DS .$filePath;if(!file_exists($filePaths)){mkdir($filePaths,0777,true);}$inf…

百度移动联盟(munion)-广告平台投放流程详细介绍 (绿色通道)

1. 百度平台官网介绍: http://hi.baidu.com/mobads/blog/ ... 1c7fc3bc3e1e2e.html2. AdView 官网介绍: 为开发者提供“AdView-百度” 绿色通道审核;提供除百度分成外额外AdView渠道分成;赚取更多,更稳定的广告费用&a…

linux命令查询邮件发送状态,Linux发邮件之mail命令详解

一、mail命令1.配置vim /etc/mail.rc文件尾增加以下内容set from1968089885qq.com smtp"smtp.qq.com"set smtp-auth-user"1968089885qq.com" smtp-auth-password"123456"set smtp-authlogin说明:from: 对方收到邮件时显示的发件人smt…

从一个骗局谈生活中的基础算法

曾经有一个著名的骗局:小明是一个赌马爱好者,最近他连续几次提前收到了预测赌马结果的邮件,从一开始由于不屑而错失良机,到渐渐深信不疑,直到最后给邮件发送方汇了巨款才发现上当。看过这个的人应该知道,骗…

用得最多的冒泡排序是不是少了个关键点?

前言冒泡排序应该是很多小伙伴的最爱,简单、直接、好理解;回顾以往参与和阅读的项目,凡是牵涉自定义排序的算法,很大一部分都在用冒泡,其中很多都忽略了一个关键点;来,咱们细细品…正文1. 冒泡排…

【POJ】【最小生成树】1789 Truck History

1 思路 题目链接。最小生成树&#xff08;MST&#xff09;问题。 2 代码 代码来自宇宙吾心博客。 #include <iostream> #include <limits> #include <cstring> using namespace std; const int N2001;char c[N][8]; // 保存字符串 int …

linux怎么搜索特定文件夹,linux如何在特定文件夹中查找特定文件

user188095724linuxfind这是我的文件夹结构:/site1/myFolder/otherFolder1/a.gif/site1/myFolder/otherFolder1/b.png/site1/myFolder/otherFolder1/c.php.../site2/myFolder/otherFolder2/d.gif/site2/myFolder/otherFolder2/e.png/site2/myFolder/otherFolder2/f.php.../site…

荐书 | 攻克世纪难题,拒绝领取菲尔兹奖的孤独数学天才的一生

今天小木给大家介绍五本数学科普文&#xff0c;了解了一些数学家研究数学、证明猜想的经历&#xff0c;他们的专研精神简直让小木五体投地&#xff01;这也验证了一句经典名言“念念不忘&#xff0c;必有回响”。希望我们都能把时间奉献给自己喜欢的事情上。下面&#xff0c;让…

C# 搭建自己的NuGet服务器,上传自定义NuGet包

第一步搭建NuGet服务器创建空Web项目安装Nuget服务&#xff0c;目前最新版本2.8.2安装完成&#xff0c;会自动生产服务&#xff0c;出现如下界面发布该网站&#xff0c;并部署至IIS将.nupkg文件发布至网站的Packages目录。在VS中修改NuGet引用路径注意把自定NuGet放在首位&…

在不同的ObjectContext中更新数据

第一个using中获取一些数据 User u; using (var db new Entities()) {u db.Users.First(); } 在using外改变 u.NickName "ABC"; 在第二个using中把改变更新到库 using (var db new Entities()) { …… db.SaveChanges(); } 在网上看了一些使用ApplyPropertyC…

5分钟理解一致性哈希算法

来自&#xff1a;cywosp链接&#xff1a;https://blog.csdn.net/cywosp/article/details/23397179一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希&#xff08;DHT&#xff09;实现算法&#xff0c;设计目标是为了解决因特网中的热点(Hot spot)问题&#xff0c;初衷…

linux 取消证书登录密码,SUSELinux 中为 SSH 访问设置不输入密码的证书认证登录方式...

SSH Client &#xff1a;linux-gxntSSH Server &#xff1a;xxzx-rdb目的&#xff1a; linux-gxnt 上的 nagios 用户以相同的用户(nagios)SSH 登录xxzx-rdb &#xff0c;不用输入密码。1.在 SSH Client 和 Server 上使用 yast 创建 nagios 用户和nagios 组&#xff0c;nagios 用…

Blazor 初探

Blazor 初探目录一、新建项目二、ASP.NET Core Blazor 项目结构三、结合代码讲解四、改造五、配置文件的使用六、发布到 Linux&#xff08;CentOS&#xff09;题外话&#xff0c;期间遇到个问题反向代理七、地址独立观察员 2021 年 4 月 11 日上个月发了篇文章《Blazor 中如何下…

Relaltek声卡在UBUNTU下没有声音的解决方法。

为什么80%的码农都做不了架构师&#xff1f;>>> The computer has an HDA Intel chip (Realtek ALC887) and I couldnt open alsamixer (this error was displayed: "load hw:0 error: Invalid argument"), although the sound seemed to be working in …

.Net项目模板进阶

友情提示&#xff1a;这篇有点长&#xff0c;有点绕&#xff0c;加油&#xff01;上一篇文章&#xff0c;简单的说明了一下.net项目模板的创建&#xff0c;主要是通过在项目文件*.csproj同目录下添加.template.config文件夹和里面的template.json&#xff0c;再用dotnet new -i…

Web Worker 使用教程

一、概述JavaScript 语言采用的是单线程模型&#xff0c;也就是说&#xff0c;所有任务只能在一个线程上完成&#xff0c;一次只能做一件事。前面的任务没做完&#xff0c;后面的任务只能等着。随着电脑计算能力的增强&#xff0c;尤其是多核 CPU 的出现&#xff0c;单线程带来…

bert模型需要什么版本Linux,Bert模型

Bert语言表征预训练。1有上下文——根据整句话生成词表征2无上下文——word2vec 和glove词汇表中每个单词生成单个词嵌入表征&#xff0c;bank、bank deposit、river bank 相同表征Unsupervised(仅使用语料库),深度双向Bert建立在上下文预训练语境表征工作基础上&#xff0c;半…

Hmm

http://blog.sina.com.cn/s/blog_46ed82810100cgwb.html 彻底搞定C指针&#xff0d;const int * pi/int * const pi的区别 http://www.qnr.cn/pc/lin/study/201008/521819.html Linux系统内存监控全面讲解之free命令 http://www.qnr.cn/pc/lin/study/201008/521844.html 具有杀…