.net core实践系列之SSO-跨域实现

接着上篇的《.net core实践系列之SSO-同域实现》,这次来聊聊SSO跨域实现方式。这次虽说是.net core实践,但是核心点使用jquery居多。

建议看这篇文章的朋友可以先看上篇《.net core实践系列之SSO-同域实现》做一个SSO大概了解。

源码地址:https://github.com/SkyChenSky/Core.SSO.git

效果图

.net core实践系列之SSO-跨域实现

知识点回顾 实现原则

只要统一Token的产生和校验方式,无论授权与认证的在哪(认证系统或业务系统),也无论用户信息存储在哪(浏览器、服务器),其实都可以实现单点登录的效果

实现关键点

Token的生成

Token的共享

Token校验

Token共享复杂度

同域

跨域

Token认证方式

业务系统自认证

转发给认证中心认证

同源策略

所有支持JavaScript 的浏览器,都必须遵守的安全策略,也是浏览器最基本的安全功能。

如果没有处理过发起跨域请求,就算服务器接收到了,响应成功了浏览器也是会拦截的。

 
同源

指域名,协议,端口相同

目的

浏览器为了阻止恶意脚本获取不同源上的的敏感信息。

跨域请求

然而在实际情况下跨域请求的场景也是存在的,解决方案有两种:

JSONP

响应头设置“Access-Control-Allow-Origin”

Cookie

Cookie的读取和发送也是必须遵循同源策略的。

虽说请求共享可以设置响应头Access-Control-Allow-Credentials、Access-Control-Allow-Origin与Ajax请求属性xhrFields: {withCredentials: true}进行解决,但是!

就算响应头有set-cookie浏览器也是无法正常保存的。

SSO跨域解决方式

针对cookie认证,我唯一能找到的解决方案就是跳转页面。

具体步骤:

认证中心登录成功后,请求登录中心接口获得token

携带token逐个跳转到业务系统的中转页面。

跳转完成后,返回到认证中心登录页面进行引导。

 PS:如果哪位朋友有更加好的方案,可以及时与我沟通,非常感谢

实现方式 登录中心授权

<script> $(function () { $("#submit").click(function () { $("#postForm").ajaxSubmit(function (result) { if (result.success) { var token = getToken(); if (token) { var authorizeHostArray = new Array( "http://www.web1.com/Token/Authorization", "http://www.web2.com/Token/Authorization" ); var authorizeHostParams = ""; authorizeHostArray.forEach(function (item) { authorizeHostParams += "&hostAuthorization=" + item; }); window.location.href = authorizeHostArray[0] + "?token=" + token + authorizeHostParams; } } else { alert(result.msg); } }); }); function getToken() { var token = null; $.ajax({ url: "/api/Token", type: "GET", async: false, success: function (d) { token = d.token; } }); return token; } }); </script>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzzww.html