偷懒小工具 - SSO单点登录通用类(可跨域)(上)
目的
目的很明确,就是搭建单点登录的帮助类,并且是一贯的极简风格(调用方法保持5行以内)。
并且与其他类库,关联性降低。所以,不使用WebAPI或者WebService等。
思路
因为上次有朋友说,光看见一堆代码,看不见具体思路。所以,这次分享,我把思路先写出来。
懒得看实现代码的朋友,可直接查看“思路”这个子标题。
同时如果有好的想法,请修改后在github上推给我。Talk is cheap,Show me the code
思路
同域
同域需要考虑的问题比较少。只需要考虑,MVC和WebForm的Request如何获取即可。
实现流程图如下
1. 因为是使用同样的Cookie所以名称和加密方式必须一致。
2. 需要设置登录成功后,回跳的网址。因为Forms身份认证的ReturnURL不能获得请求原网址。
3. 剩下的就如图所示了。不明白的可以追问,我就不细说了。
跨域
跨域除了需要考虑同域的问题外,还需要考虑状态共享。因为同源策略问题,故此使用JSONP。
1. 因为不是Cookie共享,所以只需要设置相同的加密方法即可。
2. 需要在认证网站,添加可登录的其他网站集合,使用逗号分隔。
3. 需要在其他网站,创建一个Login页面并调用帮助类的验证方法。配置认证网站URL。
4. 当认证网站登录成功后,会根据配置的其他网站,给他们发送JSONP请求,让他们自动登录。
5. 注销同理。JSONP请求方式,可参考这篇文章:jsonp详解。使用的就是添加js标签的方式。
至此,思路说明结束。不明白的可以追问。
详细设计
简介
整个类库格式如下,我尽量进行了重构,让各位看着方便一些。因为懒所以只是尽量重构。
SSO.js:跨域单点登录,需要在登录页面引用的Javascript脚本。
SSOCrossDomain:跨域帮助类
SSOSameDomain:同域帮助类
App.config:跨域帮助类,涉及到的配置示例
需要在认证网站和其他网站中,同时引用这个类。并根据自己的需求,看调用哪个帮助类。
使用方法
首先,我们创建如下结构的解决方案来进行演示。
Authorize:是WebForm的认证网站,使用MVP的PV模式搭建。其他的均为需要共享的网站。
MVC1:是MVC的认证网站。认证网站均实现了,最简单的登录功能。
同域
首先说一下同域如何使用。
1. 我们需要配置相同的身份验证。那么我们在Web.Config中,写上如下代码。
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" name="CookiesTest" cookieless="UseCookies"></forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
<machineKey validationKey="5029E82E1779497186D46F83D78FAD3211D46F83D78FAD" validation="SHA1" decryptionKey="5029E82E1779497186D46F83D78FAD3211D46F83D78FAD" decryption="DES" />
</system.web>
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<authentication mode="Forms">
<forms loginUrl="http://localhost:51666/Login.aspx?link=http://localhost:56757/WebForm1.aspx" name="CookiesTest" cookieless="UseCookies"></forms>
<!--<forms loginUrl="~/Login.aspx" name="CookieWeb1" cookieless="UseCookies"></forms>-->
</authentication>
<authorization>
<deny users="?" />
</authorization>
<machineKey validationKey="5029E82E1779497186D46F83D78FAD3211D46F83D78FAD" validation="SHA1" decryptionKey="5029E82E1779497186D46F83D78FAD3211D46F83D78FAD" decryption="DES" />
</system.web>
配置东西分别为:Forms认证,禁止匿名用户访问,配置单点登录加密方式。
其中Web1的Forms认证,指向的就是Authorize,并且使用link当做后缀,进行成功后跳转。
2. 需要在Authorize网站中,添加登录页面,并添加登录后的调用方法。
/// <summary>
/// 用户登录方法
/// </summary>
private void LoginView_Submit(object sender, AuthorizeEventArgs e)
{
string userName = LoginView.UserName;
string password = LoginView.Password;
if (ValidationUserInfo(userName, password))
{
//同域单点登录
SSOSameDomain sso = new SSOSameDomain(e.Page);
sso.LogIn("CookiesTest", new TimeSpan(0, 1, 0), userName);
////跨域单点登录
//SSOCrossDomain cross = new SSOCrossDomain(e.Page);
//cross.LogIn("CookiesTest", new TimeSpan(0, 1, 0), userName);
}
}
SSOSameDomain,分别可以接受Page和HttpContextBase,作为读取Request的媒介。
所以各位如果不用MVP,可实例化时直接this。
LogIn登录方法,需要传递配置的Cookie名称、过期时间和需要保存的内容。
3. 配置注销功能,在点击注销后,执行如下方法。
protected void SignOut_Click(object sender, EventArgs e)
{
new SSOSameDomain(this).LogOut();
//new SSOCrossDomain(this).LogOut();
}
4. 获取用户内容,可以调用帮助类的GetUserData方法。传递Cookie名称,即可获取对应内容。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (User.Identity.IsAuthenticated)
{
var result = new SSOSameDomain(this).GetUserData("CookiesTest");
txtUserData.Text = result;
//SSOCrossDomain cross = new SSOCrossDomain(this);
//txtUserData.Text = cross.GetUserData("CookieWeb1");
}
}
}
至此,我们已经完成了同域的单点登录。
跨域
跨域因为需要验证,所以会比同域操作多几步。注意:每个网站都必须有类似Login.aspx页面用作登录存储。
1. 首先配置相同的加密方式,因为我们的JSONP传递的是密文,所以解密方式必须一致。
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" name="CookiesTest" cookieless="UseCookies"></forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
<machineKey validationKey="5029E82E1779497186D46F83D78FAD3211D46F83D78FAD" validation="SHA1" decryptionKey="5029E82E1779497186D46F83D78FAD3211D46F83D78FAD" decryption="DES" />
</system.web>
其他网站的Forms认证页面,都指向本地的Login.aspx。注意加密方式必须一致,不然无法解密。
2. 认证网站设置可登录的网址集合,在配置文件中添加集合,使用逗号分隔。
<appSettings>
<add key="LoginUrl" value="http://localhost:56757/Login.aspx,http://localhost/Web2/Login.aspx" />
</appSettings>
3. 其他网站设置统一认证的网址,并添加成功后跳转的地址。
<appSettings>
<add key="AuthorizeUrl" value="http://localhost:51666/Login.aspx?link=http://localhost:56757/WebForm1.aspx" />
</appSettings>
至此,配置结束,我们接下来说一下如何调用。
4. 认证网站,添加验证登录和登录方法。
public void Initialize(Page page)
{
SSOCrossDomain cross = new SSOCrossDomain(page);
cross.ValidationLogIn("CookiesTest", new TimeSpan(0, 1, 0));
}
///<summary>
/// 用户登录方法
/// </summary>
private void LoginView_Submit(object sender, AuthorizeEventArgs e)
{
string userName = LoginView.UserName;
string password = LoginView.Password;
if (ValidationUserInfo(userName, password))
{
////同域单点登录
//SSOSameDomain sso = new SSOSameDomain(e.Page);
//sso.LogIn("CookiesTest", new TimeSpan(0, 1, 0), userName);
//跨域单点登录
SSOCrossDomain cross = new SSOCrossDomain(e.Page);
cross.LogIn("CookiesTest", new TimeSpan(0, 1, 0), userName);
}
}
Initialize:是Login.aspx页面初始化执行的方法,我们调用帮助类的
ValidationLogin,验证是否登录。
Login:调用帮助类的Login方法,可以保存登录状态,并向其他网站进行发送状态。
5. 其他网站,添加验证登录方法。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SSOCrossDomain cross = new SSOCrossDomain(this);
cross.ValidationLogIn("CookieWeb1", new TimeSpan(0, 2, 0));
}
}
ValidationLogIn :验证登录方法,传递参数:本地存储的Cookie名称,过期时间。
6. 其他网站,添加注销方法和获取登录内容。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (User.Identity.IsAuthenticated)
{
var result = new SSOSameDomain(this).GetUserData("CookiesTest");
txtUserData.Text = result;
//SSOCrossDomain cross = new SSOCrossDomain(this);
//txtUserData.Text = cross.GetUserData("CookieWeb1");
}
}
}
protected void SignOut_Click(object sender, EventArgs e)
{
//new SSOSameDomain(this).LogOut();
new SSOCrossDomain(this).LogOut();
}
至此,我们已经完成了跨域的单点登录。每个调用,不超过5行代码,极简风格。
偷懒小工具 - SSO单点登录通用类(可跨域)(上)的更多相关文章
- 偷懒小工具 - SSO单点登录通用类(可跨域)
写在前面的话 上次发布过一篇同样标题的文章.但是因为跨域方面做得不太理想.我进行了修改,并重新分享给大家. 如果这篇文章对您有所帮助,请您点击一下推荐.以便有动力分享出更多的"偷懒小工具&q ...
- Angular4 后台管理系统搭建(10) - 做一个通用的可跨域上传文件的组件
写的很慢,不知不觉这是第十篇了.但是我其他事情太多,只能抽空写下.现在angular4或angular2流行的上传方式是ng2-file-upload.它的功能很强大.但是我没有配置成可以跨域上传的. ...
- [精华][推荐]CAS SSO 单点登录框架学习 环境搭建
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...
- CAS SSO单点登录框架学习
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...
- CAS SSO单点登录框架介绍
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...
- [sso] 单点登录认证流程
一.流程说明 第一步:访问cas过滤链接ssoLogin,拼凑定向到 CAS_SERVER 获取ticket的URL 第二步:CAS_SERVER校验用户信息,生成Ticket 第三步:重新定向到访问 ...
- 170810、spring+springmvc+Interceptor+jwt+redis实现sso单点登录
在分布式环境中,如何支持PC.APP(ios.android)等多端的会话共享,这也是所有公司都需要的解决方案,用传统的session方式来解决,我想已经out了,我们是否可以找一个通用的方案,比如用 ...
- SSO单点登录思路
SSO (Single Sign On) 什么是单点登录: 在大型的互联网公司中会有多个系统, 多个项目, 虽然这些项目都属于同一家公司, 但是项目本身其实都是独立的, 那多个系统可不可以实现共享同一 ...
- 【SpringSecurityOAuth2】源码分析@EnableOAuth2Sso在Spring Security OAuth2 SSO单点登录场景下的作用
目录 一.从Spring Security OAuth2官方文档了解@EnableOAuth2Sso作用 二.源码分析@EnableOAuth2Sso作用 @EnableOAuth2Client OA ...
随机推荐
- Baxter机器人---安装SDK包(二)
原创博文,转载请标明出处:--周学伟http://www.cnblogs.com/zxouxuewei/ 一.frist baxter robot workspace root@zxwubuntu-A ...
- POJ2284 That Nice Euler Circuit (欧拉公式)(计算几何 线段相交问题)
That Nice Euler Circuit Time Limit: 3000MS M ...
- HDU-5785 Interesting(Manacher算法+区间处理)
题目大意:给一个字符串,求所有相邻两回文子串的外侧下标之积的和 题目分析:另L[i]为所有以 i 为右端点的回文字串的左端点之和,同理,另R[i]表示所有以 i 为左端点的回文子串的右端点之和.显然, ...
- hdu1074 状压DP、栈实现记录路径
题意:给了几门学科作业.它们的截止提交期限(天数).它们的需要完成的时间(天数),每项作业在截止日期后每拖延一天扣一学分,算最少扣的学分和其完成顺序. 一开始做的时候,只是听说过状态压缩这个神奇的东西 ...
- 论文笔记之:Deep Reinforcement Learning with Double Q-learning
Deep Reinforcement Learning with Double Q-learning Google DeepMind Abstract 主流的 Q-learning 算法过高的估计在特 ...
- ADC 分辨率和精度的区别
分辨率和精度这两个,经常拿在一起说,才接触的时候经常混为一谈.对于ADC来说,这两样也是非常重要的参数,往往也决定了芯片价格,显然,我们都清楚同一个系列,16位AD一般比12位AD价格贵,但是同样是1 ...
- Linux-配置虚拟IP实例
在日常linux管理工作中,需要为应用配置单独的IP地址,以达到主机与应用的分离,在应用切换与迁移过程中可以做到动态切换,特别是在使用HA的时候,这种方案可以保证主机与应用的隔离,对日常的运维有很大的 ...
- python_Memcached
一.Memcached 1.Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网 ...
- html之input系列标签
input属性太多,我这里仅列出几个我喜欢的吧. disabled:首次加载时禁用此元素 checked:首次加载时选中此元素 form:输入字段所属的一个或多个表单 hieght:定义input字段 ...
- 根据N种规格中的M种规格值生成的全部规格组合的一种算法
近来在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...