前言

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

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

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

效果图

知识点回顾

实现原则

只要统一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认证,我唯一能找到的解决方案就是跳转页面。

具体步骤:

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

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

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

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

实现方式

登录中心授权

业务系统Token保存与注销

public class TokenController : Controller

{

public static TokenCookieOptions CookieOptions { get; set; }

public IActionResult Authorization(string token, List<string> hostAuthorization = null)

{

if (CookieOptions == null || string.IsNullOrEmpty(token))

return BadRequest();

HttpContext.Response.Cookies.Append(CookieOptions.Name, token, new CookieOptions

{

Domain = CookieOptions.Domain,

Expires = DateTimeOffset.UtcNow.Add(CookieOptions.Expires),

HttpOnly = CookieOptions.HttpOnly,

IsEssential = CookieOptions.IsEssential,

MaxAge = CookieOptions.MaxAge,

Path = CookieOptions.Path,

SameSite = CookieOptions.SameSite

});

if (hostAuthorization.Any())

hostAuthorization = hostAuthorization.Where(a => !a.Contains(HttpContext.Request.Host.Host)).ToList();

if (!hostAuthorization.Any())

hostAuthorization = new List<string> { "http://www.sso.com" };

return View(new TokenViewData

{

Token = token,

HostAuthorization = hostAuthorization

});

}

public IActionResult Logout(List<string> hostAuthorization = null)

{

HttpContext.Response.Cookies.Delete(CookieOptions.Name);

if (hostAuthorization.Any())

hostAuthorization = hostAuthorization.Where(a => !a.Contains(HttpContext.Request.Host.Host)).ToList();

if (!hostAuthorization.Any())

hostAuthorization = new List<string> { "http://www.sso.com" };

return View(new TokenViewData

{

HostAuthorization = hostAuthorization

});

}

}

Token生成与认证

与同域的实现的方式一致。

生成与认证是一对的,与之对应的就是AES的加密与解密。

业务系统自主认证的方式,对于系统的代码复用率与维护性都很低。如果想进行转发到认证系统进行认证,可以对[Authorize]进行重写。

大致思路是:

访问业务系统时,由自定义的[Authorize]进行拦截

获取到Token设置到请求头进行HttpPost到认证系统提供的/api/token/Authentication接口

响应给业务系统如果是成功则继续访问,如果是失败则401或者跳转到登录页。

结尾

最近事情比较多,demo与文章写的比较仓促,如果朋友们有更好的实现方式与建议,麻烦在下面评论反馈给我,先在此感谢。

原文地址: https://www.cnblogs.com/skychen1218/p/9805995.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.NET Core实践系列之SSO-跨域实现相关推荐

  1. .net core实践系列之短信服务-架构优化

    前言 通过前面的几篇文章,讲解了一个短信服务的架构设计与实现.然而初始方案并非100%完美的,我们仍可以对该架构做一些优化与调整. 同时我也希望通过这篇文章与大家分享一下,我的架构设计理念. 源码地址 ...

  2. ASP.NET Core微服务(三)——【跨域配置】

    ASP.NET Core微服务(三)--[跨域配置] 对应练习demo(跨域)下载路径(1积分):[https://download.csdn.net/download/feng8403000/151 ...

  3. .net core实践系列之短信服务-Api的SDK的实现与测试

    前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...

  4. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

    前言 本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替.但是为了说明调度任务使用实现也 ...

  5. .net core实践系列之短信服务-架构设计

    前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...

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

    前言 SSO的系列还是以.Net Core作为实践例子与大家分享,SSO在Web方面复杂度分同域与跨域.本篇先分享同域的设计与实现,跨域将在下篇与大家分享. 如有需要调试demo的,可把SSO项目部署 ...

  7. asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)

    这一节主要讲如何测试跨域问题 你可以直接在官网下载示例代码,也可以自己写,我这里直接使用官网样例进行演示 样例代码下载: Cors 一.提供服务方,这里使用的是API 1.创建一个API项目.或者直接 ...

  8. .net core实践系列之短信服务-为什么选择.net core(开篇)

    前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...

  9. 来吧学学.Net Core之登录认证与跨域资源使用

    序言 学习core登录认证与跨域资源共享是越不过的砍,所以我在学习中同样也遇到啦这两个问题,今天我们就用示例来演示下使用下这2个技术点吧. 本篇主要内容如下: 1.展示一个登录认证的简单示例 2.跨域 ...

最新文章

  1. 带android小绿人的屏保相册,盘点:那些年我们追过的Android
  2. 积分商城如何梳理思路和进行设计
  3. 用python一键批量压缩备份文件,不必再用鼠标点点点
  4. YouTube增加社交功能:邀请联系人聊天 可30人群聊
  5. 无忧考吧python编译环境不存在_python:flake8找不到不存在的方法
  6. VTK:相互作用之ImageRegion
  7. VTK:Filtering之ExtractVisibleCells
  8. C++ vector容器 find erase的使用:查找并删除指定元素
  9. addeventlistener事件第三个参数 passive_JS DOM 事件流、事件冒泡
  10. python字典值求和_Python两个字典键同值相加的方法总结
  11. html 滑动网格列表,网格列表
  12. Error:To install them, you can run: npm install --save vue-style-loader css-loader……
  13. 华为海思芯片自立自强!
  14. 方立勋jdbc mysql视频_java视频教程 Java自学视频整理(持续更新中...)
  15. 重磅!腾讯优图11篇论文入选AI顶会AAAI 2021
  16. 加速打开win10自带图片查看器
  17. 鸿蒙系统8月9日登场,华为自研鸿蒙系统将于8月9日正式登场,还有全新的鸿鹄芯片...
  18. 信息科学技术与创新之“知识升华”
  19. openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
  20. WORDBOOK - ForeverStrong Cheng - YongQiang Cheng

热门文章

  1. rest-framework-权限组件
  2. Unity(创建脚本)
  3. javascriptjquery 判断滚动到页面底部
  4. SSH连接linux时,长时间不操作就断开的解决方案
  5. jquery验证手机号码和邮箱地址例子
  6. yum安装最新的 LNMP
  7. [导入]php 安全基础 第八章 共享主机 文件系统浏览
  8. BeetleX服务网关流量控制
  9. 2021年全球知名开源项目大更新
  10. Dapr云原生应用开发系列7:工作流集成