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

如: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. HttpClient与浏览器调用服务接口差异

    我用httpclient访问接口,统计图有些不均匀,差距较大 ,有时只有几十毫秒,下图看到这种情况占多数,600-800毫秒之间的算是浏览器正常的产生调用接口的时间耗时 然后用jmeter跑时都是均值 ...

  2. matlab练习程序(高斯牛顿法最优化)

    计算步骤如下: 图片来自<视觉slam十四讲>6.2.2节. 下面使用书中的练习y=exp(a*x^2+b*x+c)+w这个模型验证一下,其中w为噪声,a.b.c为待解算系数. 代码如下: ...

  3. 模拟开户接口,使用python脚本实现批量用户开通

    1.目的 通过模拟接口方法,实现批量用户开通 2.分析 A.接口含body和head部分,其中body中的某些变量为必填字段,包含用户的信息. B.用户信息清单可以整理成ott_after_check ...

  4. if语句的嵌套以及条件运算符和条件表达式(初学者)

    1.当if语句中的执行语句又是if语句时,则构成了if语句的嵌套情形. 其一般形式可表示为: if() { if()……; } 或: if() if()语句1: else 语句2: else if() ...

  5. 最大子序和的golang实现

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 输入: [-,,-,,-,,,-,], 输出: 解释: 连续子数组 [,-,,] 的和最大,为 ...

  6. webpack4升级extract-text-webpack-plugin和UglifyJsPlugin问题

    webpack4升级extract-text-webpack-plugin和UglifyJsPlugin问题 1.  使用了extract-text-webpack-plugin插件后,编译出错,代码 ...

  7. POST提交数据之---Content-Type的理解;

    POST提交数据之---Content-Type的理解: Content-Type是指http/https发送信息至服务器时的内容编码类型,contentType用于表明发送数据流的类型,服务器根据编 ...

  8. 编程实现类似Linux下cp功能

    MyCP的代码实现 一.题目要求: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bi ...

  9. MySQL 基础七 视图

    -- 查看表 SELECT * FROM student; SHOW CREATE TABLE student; -- 创建视图 CREATE VIEW v_student1 AS SELECT *F ...

  10. SQL 清理缓存 更新无效

    --查询结果1 select * from Student where ID='CCB87B71-FB78-4BFE-8692-24DD2D8F8460' --查询结果2 where ID='CCB8 ...