SSO - 开篇引例
进公司以来, 所做的产品中, 下面的子系统就没有少于10个的, 其中有的是.net做的, 有的是java做的, 还有安卓端, ios端. 那么这么多子系统, 我可能需要访问其中的多个(同一平台), 我是否需要登录多次来操作呢? 这样是不是太不方便了. 在我们登录qq之后, 进入qq邮箱, 也并没有让我们多登录一次, 而是直接进去了. 那么在我们的这些系统中, 怎么来实现这种功能呢?
到这里, 就引出今天的主题 - SSO 单点登录. 在我们登录系统A之后, 去访问系统B, 此时并不需要再去登陆一次了. 这里有一个前提, 就是不论系统A还是系统B, 用的都是同一个账户和密码. 如果他们之间的用户名和密码不相同, 就麻烦很多了.
在网上搜到的单点登录解决方案, 比较多的是CAS, 耶鲁大学弄得一个单点登录解决方案。当然,在此篇,并不会介绍到CAS,只是通过一个小例子,来看看轮廓而已。
一、效果展示
在这里,我有三个网站, 当我在Server这个网站登录之后,ClientA,ClientB我直接输入backUrl后面的地址, 看看是否要让我登录。
输入之后, 让我直接进去了, 而没有让我再次登录。
当我在HomeA页面登出之后, 再去刷新其他的两个页面来看。
其他两个页面,也被迫登出了。
从效果上看, 是不是一个系统登录, 多个系统可以免登录了, 一处登出, 多个系统都被登出。 这就是一个单点登录的效果了。
二、关键代码
服务器登录部分:
[NoLogin]
public ActionResult LoginCheck(string userName, string userPwd)
{
if (userName == "admin" && userPwd == "")
{
User user = new User { Guid = Guid.NewGuid().ToString(), Name = "admin", Pwd = "" }; var newCookie = new HttpCookie("userCode", user.Guid);
newCookie.Expires = DateTime.Now.AddDays();
Response.Cookies.Add(newCookie); RedisCache.Instance.Set(user.Guid, user, TimeSpan.FromMinutes()); return Json(new { status = "ok", guid = user.Guid });
}
return Json(new { status = "notMatch" });
}
这里的NoLogin就是一个空的特性,里面啥都没有,可以放在类和方法上,用来判断是否不需要登录就可以直接访问页面。
当验证成功登录后, 将生成一个凭据Guid, 一会用户手持这个凭据来系统验证, 我这边就只看redis缓存中是否有这个缓存存在, 有则表示已经登录。并没有做更多的验证了。
我这里的redis是部署在ubuntu虚拟机上面的, redis对windows的支持并不是很好, 但是也能找到windows的版本, 如果可能的话, 我还是建议使用 linux 部署 redis。
客户端验证部分:
public class SSOClientAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//判断请求的方法或者控制器上, 有没有免登陆特性
if (filterContext.ActionDescriptor.IsDefined(typeof(NoLoginAttribute), false)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(NoLoginAttribute), false))
{
return;
} //需要登陆的方法, 继续验证
base.OnAuthorization(filterContext);
} protected override bool AuthorizeCore(HttpContextBase httpContext)
{
HttpCookie cookie = httpContext.Request.Cookies["userCode"];
if (cookie == null || string.IsNullOrEmpty(cookie.Value))
return false; var user = RedisCache.Instance.GetOrDefault<User>(cookie.Value); if (user != null)
{
cookie.Expires = DateTime.Now.AddDays();
httpContext.Response.SetCookie(cookie);
RedisCache.Instance.Set(user.Guid, user, TimeSpan.FromMinutes());
return true;
} return false;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
string loginUrl = ConfigurationManager.AppSettings["LoginUrl"];
string Url = filterContext.RequestContext.HttpContext.Request.Url.AbsoluteUri;
loginUrl += "?backUrl=" + Url;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
}
登出部分就简单了, 只要清除cookie和redis缓存就行了。代码就不贴了。
三、结束语
CAS的单点登录比这个复杂多了, 这里只是我自己弄得一个小Demo,只是对单点登录的一个初步认识,后面有机会的话, 希望我会把Cas的搭建、使用方法或者解析贴出来。
参考:
蔡的mysso例子(以前看过他的例子,我写的更简单点,能实现效果就成了)
SSO - 开篇引例的更多相关文章
- Java多线程引例及实现多线程的方式
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术. Java多线程是由JVM来实现,不必关心操作系统的调用问题. 假如我们要实现如下功能: public c ...
- 单点登录SSO
转载自 http://www.blogjava.net/xcp/archive/2010/04/13/318125.html 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当 ...
- Java实现SSO
摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...
- SSO单点登录解决方案[转载]
1 什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互 ...
- 单点登录实现机制:桌面sso
参考链接,感谢作者:https://zm10.sm-tc.cn/?src=l4uLj8XQ0IiIiNGckZ2TkJiM0ZyQktCZlo2Mi5uNmp6S0I/QysrJyszPztGXi5K ...
- OAuth2实现单点登录SSO
1. 前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”.网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么回事儿,简直让人抓 ...
- SSO 单点登录解决方案
转自:http://www.blogjava.net/Jack2007/archive/2014/03/11/191795.html 1 什么是单点登陆 单点登录(Single Sign O ...
- c#编程基础之ref、out参数
引例: 先看这个源码,函数传递后由于传递的是副本所以真正的值并没有改变. 源码如下: using System; using System.Collections.Generic; using Sys ...
- html基础起航
废话不多说,直接上例子! 工欲善其事,必先利其器 浏览器要有吧~ 比如:IE.Chrome.Firefox…… 纯文本编辑软件不可少~ 比 ...
随机推荐
- Ubuntu Remove Mysql.service in Systemctl
After installing MySQL 5.7, I do not want to start MySQL via systemctl. It's unconvenient and compli ...
- (01背包)Buy the souvenirs (hdu 2126)
http://acm.hdu.edu.cn/showproblem.php?pid=2126 Buy the souvenirs Time Limit: 10000/1000 MS (Java/Oth ...
- Alpha阶段敏捷冲刺(八)
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:写了关于统计的按钮的代码. 徐璐琳:完善了&q ...
- Foundation-NSRunLoop
Objective-C之run loop详解 Objective-C之run loop详解 RunLoop 详解
- Pychar-20170301快捷键
Pychar IDE 2017.03.03 版本的特性 ------------------------------------------------Ctrl+D:(Dumplicated) 复制选 ...
- hdu 5074 相邻数和最大dp
http://acm.hdu.edu.cn/showproblem.php?pid=5074 给定一个序列 有些位数未知,给你所有两个数连续所得到的能量,问你怎么安排数字使得总能量最大 二维dp,dp ...
- tarjan算法的补充POJ2533tarjan求度
做题时又遇到了疑惑,说明一开始就没有完全理解 基于dfs的tarjan,搜索时会有四种边 树枝边:DFS 时经过的边,即 DFS 搜索树上的边 前向边:与 DFS 方向一致,从某个结点指向其某个子孙的 ...
- 第一天---关于环境和java基础
一.版本管理 git svn 二.Intellj idea快捷键 三.java基础知识
- chrome常用小插件
1.广告终结者 (去广告) 2.adsafe2.0.1 (去广告) 3.Infinity New Tab ( ...
- oc门
OC门电路,即集电极开路输出结构门电路,电路结构图为: