在同一个域名下有很多子系统

如:a.giant.com  b.giant.com   c.giant.com等

但是这些系统都是giant.com这个子域。

这样的情况就可以在不引用其它框架的情况下,直接基于Cookie实现同域单点登录SSO

注:用ID4,OAuth,其它SSO框架也同样可以实现。本文不讨论。

为了简单表示。在这里登录页只输入一个用户名,然后登录
后台接收到登录名后,构建登录信息。然后登录
代码如下:

    <form enctype="application/x-www-form-urlencoded" method="post">
@if (!User.Identity.IsAuthenticated)
{
<div><label>用户名:<input type="text" name="UserName" /></label><button type="submit">登录</button></div>
}
else
{
<div><label>用户名:@User.Identity.Name</label><a href="/Home/SignOut">退出</a></div>
}
</form>
    public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Index(string UserName)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, UserName)
}; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
return RedirectToAction("Index");
}
public async Task<IActionResult> SignOut()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Index");
}
}
    public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_2);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvcWithDefaultRoute();
}
}

这样就可以实现一个子系统的简单登录,效果如下

同样创建一个COM.WebB.SSO,写同样的代码实现登录。

但是这样只能A站点登录A系统,B站点登录B系统。两个系统相互独立

如果我们要实现aUser登录A系统后,B系统也自动登录aUser。

那么就可做如下改造

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SSOContext>(option => {
option.UseSqlServer(Configuration.GetConnectionString("SSO"));
});
services.AddDataProtection()
.PersistKeysToDbContext<SSOContext>() //把加密数据保存在数据库
//.PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\")) //把加密信息保存大文件夹
.SetApplicationName("SSO"); //把所有子系统都设置为统一的应用名称 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,options=> {
options.Cookie.Name = ".AspNet.SharedCookie";//设置统一的Cookie名称
options.Cookie.Domain = ".giant.com";//设置Cookie的域为根域,这样所有子域都可以发现这个Cookie
});
services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_2);
}

主要是增加了services.AddDataProtection配置
其中,数据加密配置保存方式现阶段asp.net Core支持
1。保存到文件:PersistKeysToFileSystem
2。保存到数据库:PersistKeysToDbContext<Context>
3。保存到Redis:PersistKeysToStackExchangeRedis
4。保存到Azure:PersistKeysToAzureBlobStorage
当然也可以自己实现存储方式,实现IXmlRepository

我这里实现了保存到数据库,代码如下:

    public class SSOContext : DbContext, IDataProtectionKeyContext
{
public SSOContext(DbContextOptions<SSOContext> option)
: base(option)
{ }
public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
}

主要就是在DbContext基础上实现接口:IDataProtectionKeyContext

这里修改配置主要统一了数据加密方式与统一应用名称
这样其它子域的Cookie加密数据就能识别。

再配置统一的Cookie名称与写的域名为根域。
这样所有子域都能发现与识别此登录的Cookie信息
这样就可以实现一个系统登录,其它子系统都登录
一个子系统退出。其它子系统也都退出的功能

源代码下载地址:https://github.com/GiantLiu/COM.SSO

Asp.Net Core基于Cookie实现同域单点登录(SSO)的更多相关文章

  1. 使用Cookie实现跨域单点登录的原理

    对于构建分布式系统来说业务功能的物理部署会随着新业务模块的增加而增加或改变物理部署的位置.而每个用户都有统一的帐号作为我们登录系统时的一个认证.当新业务或子系统部署在不同的物理机上,我们去访问不同的业 ...

  2. 理解ASP.NET Core - 基于Cookie的身份认证(Authentication)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 通常,身份认证(Authentication)和授权(Authorization)都会放 ...

  3. 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析

    写着前面 IdentityServer4的学习断断续续,兜兜转转,走了不少弯路,也花了不少时间.可能是因为没有阅读源码,也没有特别系统的学习资料,相关文章很多园子里的大佬都有涉及,有系列文章,比如: ...

  4. ASP.NET Core 基于JWT的认证(一)

    ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...

  5. 如何在ASP.NET Core中实现CORS跨域

    注:下载本文的完整代码示例请访问 > How to enable CORS(Cross-origin resource sharing) in ASP.NET Core 如何在ASP.NET C ...

  6. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  7. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  8. Asp.Net Core存储Cookie不成功

    Asp.Net Core存储Cookie不成功 Asp.Net Core2.1生成的项目模板默认实现了<>,所以设置存储Cookie需要做一些处理. 1.第一种是在Startup的Conf ...

  9. ASP.NET Core基于K8S的微服务电商案例实践--学习笔记

    摘要 一个完整的电商项目微服务的实践过程,从选型.业务设计.架构设计到开发过程管理.以及上线运维的完整过程总结与剖析. 讲师介绍 产品需求介绍 纯线上商城 线上线下一体化 跨行业 跨商业模式 从0开始 ...

随机推荐

  1. LeetCode题解之Binary Tree Level Order Traversal II

    1.题目描述 2.题目分析 先遍历,再反转. 3.代码 vector<vector<int>> levelOrderBottom(TreeNode* root) { vecto ...

  2. python 之路初(一):pycharm 安装 和 环境配置 和 中文乱码问题

    从健身和学习中我一体会到坚持的力量.想写写东西的想法已经好久了,就是不知道怎么开始.最近生活开始给我各种攻击和磨练,我从声嘶力竭到沉默到默默坚持自己,改变自己并总结告诉自己:少说多看,看破不说破,宁愿 ...

  3. Sender IP字段为"0.0.0.0"的ARP请求报文

    今天在研究免费ARP的过程中,抓到了一种Sender IP字段为“0.0.0.0”的ARP请求报文(广播),抓包截图如下: 这让我很疑惑.一个正常的ARP请求不应该只是Target MAC字段为全0吗 ...

  4. C#项目实践之一——WPF多媒体通讯录

    1.Window.Resources  是一种Window级的资源定义. Window.Resources它的作用范围就是在Window容器里的所有子控件,也只有这些子控件才能引用/调用这些资源 Gr ...

  5. JSON语法规则

    JSON 语法规则 JSON 语法是 JavaScript 对象表示法语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是 ...

  6. 计算机基础-CPU

    CPU(Central Processing Unit中央处理器)由运算器和控制器组成--微机性能的集成度最高的核心部件 1.金属触点 2.附带散热器 风冷式 热管散热式 水冷式等 扣具结构要和CPU ...

  7. 实用的php清除html,php去除空格与换行,php清除空白行和换行,提取页面纯文本

    实用的php清除html,换行,空格类,php去除空格与换行,php清除空白行和换行,提取页面纯文本内容 方法一: function DeleteHtml($str) { $str = trim($s ...

  8. Python数据分析实例操作

    import pandas as pd #导入pandas import matplotlib.pyplot as plt #导入matplotlib from pylab import * mpl. ...

  9. 死磕nginx系列--nginx 目录

    死磕nginx系列--nginx入门 死磕nginx系列--nginx配置文件 死磕nginx系统-nginx日志配置 死磕nginx系列--nginx服务器做web服务器 死磕nginx系列--使用 ...

  10. CF848C:Goodbye Souvenir(CDQ分治)

    Description 给定长度为$n$的数组, 定义数字$X$在$[l,r]$内的值为数字$X$在$[l,r]$内最后一次出现位置的下标减去第一次出现位置的下标给定$m$次询问, 每次询问有三个整数 ...