NET Core 2.0使用Cookie认证实现SSO单点登录
NET Core 2.0使用Cookie认证实现SSO单点登录
之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NET Core 2.0出来了试着使用ASP.NET Core尝试一下。假如我们有三个站点
- domain.dev
- order.domain.dev
- passport.domain.dev
domain.dev作为我们的主站肯定是可以匿名访问的,当点击登录按钮的时候就会跳转到passport.domain.dev,完成登录后跳转回domain.dev。order.domain.dev肯定是不可以匿名访问的必须登录才能访问,所以直接跳转到passport.domain.dev,完成登录后跳转回order.domain.dev。passport作为我们的认证系统,只要登录成功,其他各个系统(例如order,news,)都是登录状态,大概就是实现这么一个功能。
好,打开VisualStudio,哦,对了 VS 2017已经从15.3→15.3.3了,大家可以去升级
先创建三个ASP.NET Core项目,等会我们把这三个项目部署到IIS里去,并修改hosts文件,用域名去访问
对于每个项目我们都需要在Configure和ConfigureServices两个方法中写一些代码,另外Portal和Order不提供登录功能,但是提供注销功能
注册认证中间件就一行代码
app.UseAuthentication();
这里关于认证中间件得说明一下,之前在1.0的时候提供了很多认证的中间件,什么Facebook啊,Google啊,这些中间价将全部弃用,统一使用上面的代码去注册身份认证中间件,具体的认证策略在服务中指定,比如下面的代码AddCookie()方法就指定了使用Cookie认证服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options => {
options.Cookie.Domain = ".domain.dev";
options.Cookie.Name = "sso";
options.Cookie.Path = "/";
options.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\shared-auth-ticket-keys\"));
});
services.AddMvc();
}
需要说明的是DataProtectionProvider属性提供数据保护,会在指定的目录下生成一个xml文件用里面的key去加密cookie。然后在页面上放一个登陆按钮
@if (Context.User.Identity.IsAuthenticated)
{
@Context.User.Identity.Name <a href="@Url.Action("SignOut")">注销</a>
}
else
{
<a class="btn btn-default" href="http://passport.domain.dev/login?returnUrl=http://domain.dev">登录</a>
}
OK,Portal项目就完成了。
所有的登陆请求http://passport.domain.dev/login?returnUrl=后面跟上调回的地址,在passport项目的登陆页面放一个登陆按钮(用户名,密码就省了,直接登陆)
<a class="btn btn-default" href="@Url.Action("SignIn","Login",new { returnUrl=Context.Request.Query["returnUrl"]})">登录</a>
public async Task<IActionResult> SignIn(string returnUrl)
{
var user = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "bob") }, CookieAuthenticationDefaults.AuthenticationScheme));
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTimeOffset.Now.Add(TimeSpan.FromDays(180)),
});
if (string.IsNullOrWhiteSpace(returnUrl))
{
returnUrl = "http://domain.dev";
}
return Redirect(returnUrl);
}
Passport项目的Configure和ConfigureServices方法跟Porta项目保持一样。OK,Passport项目完事了
最后就剩Order项目了,刚才也说了Order项目肯定是不能匿名访问的,这里需要特殊设置一下
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options => {
options.Cookie.Domain = ".domain.dev";
options.Cookie.Name = "sso";
options.Cookie.Path = "/";
options.LoginPath = "/login";
options.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\shared-auth-ticket-keys\"));
});
// 不允许匿名访问
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
}
说一下LoginPath属性,就是说当用户没有登陆的时候就会跳转到LoginPath,但是LoginPath只能设置本地路径,不能按照下面的方式
options.LoginPath = "http://passport.domain.dev/login"; // 这样是错误的
所以我们上面设置的是/login
public class LoginController : Controller
{
[AllowAnonymous]
public IActionResult Index(string returnUrl)
{
return Redirect(string.Concat("http://passport.domain.dev/login?returnUrl=http://order.domain.dev", returnUrl));
}
}
这样我们就解决了跳转的问题
好了 ,三个项目的代码都写完了,接下来将这三个项目不熟到IIS里去

这里又得说明一下必须将项目发布以后才能部署到IIS,不能直接指定项目的物理路径,发到文件系统默认的路径应该是bin\Release\PublishOutput,应该指定这个路径

建议大家在本地开发的时候尽量合理的使用域名后缀
代码地址:https://github.com/bidianqing/SSO.Core.Sample
NET Core 2.0使用Cookie认证实现SSO单点登录的更多相关文章
- ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NE ...
- .NET Core2.0+MVC 用Redis/Memory+cookie实现的sso单点登录
之前发布过使用session+cookie实现的单点登录,博主个人用的很不舒服,为什么呢,博主自己测试的时候,通过修改host的方法,在本机发布了三个站点,但是,经过测试,发现,三个站点使用的sess ...
- .NET Core2.0+MVC 用session,cookie实现的sso单点登录
博主刚接触.NET Core2.0,想做一个单点登录的demo,所以参考了一些资料,这里给上链接: 1.http://www.cnblogs.com/baibaomen/p/sso-sequence- ...
- Asp.Net Core基于Cookie实现同域单点登录(SSO)
在同一个域名下有很多子系统 如:a.giant.com b.giant.com c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...
- 前端分享之cookie的使用及单点登录
cookie是什么 cookie的英文意思是饼干.在计算机术语中指服务端存放在客户端的一段数据.这段数据在客户端每次进行http请求时会自动加在http请求报文中的header上:服务端在响应时,可以 ...
- (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- oauth2.0实现sso单点登录的方式和相关代码
SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jquery ajax跨 ...
随机推荐
- mybatis进行分页,使用limit
这里记录两个思路: 首先是写一个不能执行的代码. <select id="query" parameterType="map" resultType=&q ...
- loading bar
上面的loading条,想到的办法是用两个半圆覆盖实现,结果也就这么做了,可是明明一个圆就可以的,哎智商堪忧... <!DOCTYPE html> <html lang=" ...
- 集训Day13
我这个肥宅一点都不快乐嘤嘤嘤 bzoj3456 求n个点的无向简单连通图的个数 我们可以用容斥推出递推式 首先我们令为 于是有 这样就是可以用CDQ分治解决的一类递推式了 不是那么明显的变形一下得到 ...
- CodeForces - 1005E2:Median on Segments (General Case Edition) (函数的思想)
You are given an integer sequence a1,a2,…,ana1,a2,…,an. Find the number of pairs of indices (l,r)(l, ...
- CF 949D Curfew——贪心(思路!!!)
题目:http://codeforces.com/contest/949/problem/D 有二分答案的思路. 如果二分了一个答案,首先可知越靠中间的应该大约越容易满足,因为方便把别的房间的人聚集过 ...
- 细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- 后缀数组dc3算法模版(待补)
模版: ; #define F(x) ((x)/3+((x)%3==1?0:tb)) #define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2) int wa[maxn ...
- ios之CoreAnimation
CoreAnimation的好处: 1.高性能,简单的编程模块 2.像View一样,使用层级结构来构建负责的界面 3.轻量级数据结构,能使上百个动画同时执行 4.抽象的动画接口,允许动画在一个独立的线 ...
- Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比
Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...
- java中多个线程访问共享数据的方式有哪些
多个线程对共同数据的访问的实现,要根据情况而定 (1)当访问共同的代码的时候:可以使用同一个Runnable对象,这个Runnable对象中有这个共享数据,比如卖票系统就可以这么做.或者这个共享数据封 ...