ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)
前言
本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录、注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证。感兴趣的可以了解一下。
- ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal
- ASP.NET Core Authentication系列(二)实现认证、登录和注销
- ASP.NET Core Authentication系列(三)Cookie选项
这三篇文章都是从单应用角度来介绍如何使用ASP.NET Core认证,但是在实际开发中,往往都是多应用、分布式部署的,仅通过上面的内容没办法直接应用到多应用上。例如有3个应用,分别对应PC端、移动端和服务端,假设它们的域名分别为www.91suke.com,m.91suke.com以及service.91suke.com,如何让这三个应用都共享认证。
本文将介绍如何通过共享授权Cookie来实现多应用间单点登录(SSO)。
源码下载地址:https://github.com/liang24/SSO
如何实现
前面我们已经解决了如何使用Cookie来实现认证功能,要实现共享授权Cookie还需要解决以下两个问题:
- Cookie共享
- Cookie的认证票据的解析
第一个问题比较简单,只要设置Cookie的域为根域,其他子域都能获得这个Cookie。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.Cookie.Name = "TestCookie"; //设置统一的Cookie名称
options.Cookie.Domain = ".91suke.com"; //设置Cookie的域为根域,这样所有子域都可以发现这个Cookie
});
第二个问题主要是让多个应用共用解析算法,在ASP.NET Core里是通过services.AddDataProtection配置数据加密保存方式。数据加密配置保存方式现阶段ASP.NET Core支持:
- 保存到文件:PersistKeysToFileSystem
- 保存到数据库:PersistKeysToDbContext
- 保存到Redis:PersistKeysToStackExchangeRedis
- 保存到Azure:PersistKeysToAzureBlobStorage
services.AddDataProtection()
//.PersistKeysToDbContext<SSOContext>() //把加密数据保存在数据库
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\server\share\directory\")) //把加密信息保存大文件夹
//.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys")
.SetApplicationName("SSO"); //把所有子系统都设置为统一的应用名称
使用PersistKeysToFileSystem
这个方法最简单,就是把生成的票据保存到磁盘目录上,多个应用同时访问这个目录,达到共享效果。
- 优点:实现简单,只要应用有目录权限即可,不需要再配置其他东西。
- 缺点:必须部署在同一台服务器上,无法分布式部署。
使用PersistKeysToDbContext
这个方法是把票据持久化到数据库,应用只要有访问数据库的权限,就能达到共享效果。
- 优点:支持分布式部署。
- 缺点:在高并发场景下,数据库IO将会是瓶颈;三种方式里实现的代码量是最多的;
使用PersistKeysToStackExchangeRedis
这个方法是把票据保存到Redis缓存里,应用只要有访问Redis的权限,就能达到共享效果。
- 优点:支持分布部署,高并发场景。
- 缺点:需要配置额外的缓存服务器。
参考资料
- Share authentication cookies among ASP.NET apps
- Sharing cookies between applications
- Asp.Net Core基于Cookie实现同域单点登录(SSO)
- 集群环境下,你不得不注意的ASP.NET Core Data Protection 机制
- .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息
ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)的更多相关文章
- ASP.NET Core Authentication系列(二)实现认证、登录和注销
前言 在上一篇文章介绍ASP.NET Core Authentication的三个重要概念,分别是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-bas ...
- ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal
前言 首先我们来看一下在ASP.NET时代,Authentication是如何使用的.下面介绍的是System.Web.Security.FormsAuthentication: // 登录 Syst ...
- ASP.NET Core Authentication系列(三)Cookie选项
前言 在本系列第一篇文章介绍了ASP.NET时代如何认证,并且介绍了如何通过web.config文件来配置Auth Cookie的选项. 第二篇文章介绍了如何使用Cookie认证,本文介绍几个常见的C ...
- Asp.Net Core基于Cookie实现同域单点登录(SSO)
在同一个域名下有很多子系统 如:a.giant.com b.giant.com c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— 准备
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
随机推荐
- Python-设置文件缓冲类型
案例: 将文件内容写入到硬件设备时候,使用系统调用,这类IO操作时间长,为了减小IO操作,通常会使用缓冲区(有足够多数据才能调用). 文件缓冲行为分为:全缓冲,行缓冲,无缓冲 如何解决? open(' ...
- 【Java】socket编程,输入输出中的问题
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWri ...
- 引用类型之Array(一)
Array类型 除了Object之外,Array类型在ECMAScript中也很常用.ECMAScript中的数组与其他多数语言中的数组有着相当大的区别.ECMAScript数组的每一项可以保存任何类 ...
- matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波
来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...
- c语言gets函数
函数gets的原型为:char*gets(char*buffer); 在 stdio.h中定义,如果要程序中用到此函数需包含#include<stdio.h> gets()函数用来从标准输 ...
- shell脚本中,关于if,以及条件判断
#!/bin/sh SYSTEM=`uname -s` #获取操作系统类型 if [ $SYSTEM = "Linux" ] ; then #如果是linux的话打印linux字符 ...
- 使用docker搭建redis服务器记录
#mkdir /home/redishome#mkdir /home/redishome/data#chmod -R 777 /home/redishome把redis.conf传到/home/red ...
- CV学习日志:CV开发常用库及其头文件
CV开发过程中,通常会涉及以下库:(1)语言/视觉:C.CPP.QT.OpenCV(2)通信/模拟:ROS2.Gazebo.Webots(3)日志/数学:Eigen3.Gflags.Glog.Cere ...
- C和C++区别——前置自增与后置自增
一.先看下面两段完全一样的代码块 /* test.cpp */ int main() { int a = 5; ++a = 7; printf("%d\n", a); return ...
- python 不可变类型
不可变类型有:字符串,元祖,数字 可变类型:列表,字典 字典中,可变类型不能为key值 #在函数中 可变类型,为全局变量时,会变化 不可变类型,为全局变量时,不会变化