ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
2017-08-31 18:25
1506 查看
之前写了一个使用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不提供登录功能,但是提供注销功能
注册认证中间件就一行代码
这里关于认证中间件得说明一下,之前在1.0的时候提供了很多认证的中间件,什么Facebook啊,Google啊,这些中间价将全部弃用,统一使用上面的代码去注册身份认证中间件,具体的认证策略在服务中指定,比如下面的代码AddCookie()方法就指定了使用Cookie认证服务。
需要说明的是DataProtectionProvider属性提供数据保护,会在指定的目录下生成一个xml文件用里面的key去加密cookie。然后在页面上放一个登陆按钮
OK,Portal项目就完成了。
所有的登陆请求http://passport.domain.dev/login?returnUrl=后面跟上调回的地址,在passport项目的登陆页面放一个登陆按钮(用户名,密码就省了,直接登陆)
Passport项目的Configure和ConfigureServices方法跟Porta项目保持一样。OK,Passport项目完事了
最后就剩Order项目了,刚才也说了Order项目肯定是不能匿名访问的,这里需要特殊设置一下
说一下LoginPath属性,就是说当用户没有登陆的时候就会跳转到LoginPath,但是LoginPath只能设置本地路径,不能按照下面的方式
所以我们上面设置的是/login
这样我们就解决了跳转的问题
好了 ,三个项目的代码都写完了,接下来将这三个项目不熟到IIS里去
这里又得说明一下必须将项目发布以后才能部署到IIS,不能直接指定项目的物理路径,发到文件系统默认的路径应该是bin\Release\PublishOutput,应该指定这个路径
建议大家在本地开发的时候尽量合理的使用域名后缀
代码地址:https://github.com/bidianqing/SSO.Core.Sample
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.Coo 4000 kie.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
相关文章推荐
- ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
- NET Core 2.0使用Cookie认证实现SSO单点登录
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
- ASP.NET Core 2.0 使用支付宝PC网站支付实现代码(转)
- ASP.NET Core 2.0 多应用实现Cookie共享
- ASP.NET学习CORE中使用Cookie身份认证方法
- asp.net core 2.0 Cookie 使用
- ASP.NET Core 2.0 使用支付宝PC网站支付实现代码
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- 使用COOKIE对像实现保存用户基本信息(结合Session),ASP.Net实现用户登录全过程
- 在ASP.NET Core 2.0中使用CookieAuthentication
- ASP.Net之使用Cookie和Session实现自动登录
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
- ASP.NET Core 2.0 使用NLog实现日志记录
- Asp.Net 之 使用Form认证实现用户登录 (LoginView的使用)
- ASP.NET 安全认证(四)-巧妙实现 Form 表单认证跨站点、跨服务器的单点登录(Single Sign On)
- Scott Mitchell 的ASP.NET 2.0数据教程之三十五:: 使用Repeater和DataList实现的主/从报表
- [ASP.NET 2.0] 六步使用ICallbackEventHandler实现无刷新回调 (转)