跨域单点登录(SSO)实现方案详解【同 净代码]
单点登录简介
定义:
传统的单站点登录访问授权机制是:登录成功后,用户信息保存在session中,sessionId保存在cookie中。当访问需要登录访问的资源(url)时,判断当前会话是否为空。如果是空的,跳转到登录界面登录,如果不是空的,允许访问。
单点登录是一种多站点共享登录访问授权机制。访问用户只需要在一个站点登录就可以访问其他站点需要登录才能访问的资源(URL)。如果用户在任何站点注销,其他站点的登录状态也将被注销。简单来说就是:在一个地方登录,到处登录。一个取消,一个到处取消。
应用场景:
当一个网站系统稍微复杂一点的时候,就需要拆分业务。例如,电子商务网站可以将产品搜索、产品详细信息、购物车和订单拆分为一个子系统。当一个系统被分成多个子系统时,它需要单点登录进行授权。
业务要求:
最近因为业务需要,公司开发了一些需要与主站集成的子系统。在网上看了很多单点登录教程后,总结了以下单点登录实现思路。轮询跳转的思想用于解决同时向多个分站写入cookie的问题。如有不妥,欢迎批评指正。
实现功能:
1.它可以完全跨域
2.url透明性(变电站跳转不需要url传递令牌或票证)
3.同步注销
4.一次将cookie写入多个子站
效果预览:
实现理念
实施困难:
这种方法的难点是如何在a.com登录的同时给b.com写cookie。我使用的方法是在sso.com维护一个分站集,登录成功后通过轮询和跳转将cookie写入每个分站。
具体想法:
1.第一次访问a.com-单击a.com页面上的登录按钮-跳转到sso.com进行登录验证-成功登录后将数据保存到缓存中-然后通过轮询跳转依次访问每个子站并将cookie写入每个子站-最后跳转到登录源页面
2.登录成功后-访问需要登录的资源(URL)-在后台向sso.com发送请求以验证cookie的有效性-验证后访问资源
代码分析
1.新建三个站点:a.com、build和sso.com
2.在a.com创建新的主页/索引页面,如下所示:
第一个访问cookie不存在。当您以模拟请求的形式前往sso.com/login/validateLogin进行验证时,将返回错误,页面显示未登录的状态
相应的查看页面如下:
对应于sso.com/login/validateLogin:
的代码
3.点击a.com首页的登录按钮,跳转到sso.com
的登录/索引页面
4.sso.com的登录代码如下:
5.单击登录,输入登录身份验证方法
生成令牌,用令牌作为密钥将用户信息保存在缓存中,并设置到期时间
获取分站集合,以重定向轮询的方式依次向每个分站写入cookie,最后重定向到登录源页面
登录验证方法如下:
a.com和b.com跳写cookie的方法代码如下:
///summary////通过跳转写入cookie///summary///param name=' token '用于授权验证的令牌/param ///param name='others '一系列分站/param ///param name='main '成功登录后返回的站点/param///returns/returns/returns public action result Jump(string token,string others,string main){ HttpCookie cookie=new HttpCookie(' currentUser ');饼干。HttpOnly=true饼干。Expires=DateTime。现在,加上年份(100);//永不过期cookie。Value=token回应。饼干.添加(饼干);//减去子站if(!字符串。isnullrempty(others)){//获取变电站集合var变电站列表=others。split (new char [] { ',' },stringsplitoptions。removeemptyentries)。to list();if (substationList。count==1){ return Redirect(others ' main=' main);} else { string current direct=SubstationList[0];替代列表。remove at(0);string otherss=string。Join(',',substationList);return Redirect(current direct ' others=' others ' main=' main);} } else { return Redirect(main);//跳转到登录源页面} }6。返回a.com/home/index或b.com/home/index的登录源页面
这时,a.com和b.com都已经有了饼干
7.注销(注销)处理
注销并直接调用sso.com/login/LoginOut方法,如下所示:
摘要
这样,用户登录信息以缓存的形式存储在sso.com,缓存的密钥作为cookie的值存储在各个分站,实现了跨域单点登录
这种方法的难点是如何在a.com登录的同时给b.com写cookie。我使用的方法是在sso.com维护一个分站集,登录成功后通过轮询和跳转将cookie写入每个分站。
这种方法在实现跨域单点登录时存在一些问题:
1.不考虑ajax登录
2.无安全验证(IP信任、cookie劫持、暴力登录.)
考虑到不足,真心希望大家能提出好的想法和补充意见
演示下载:演示
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:跨域单点登录(SSO)实现方案详解【同 净代码]是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

















