.NET Core2.0+MVC 用session,cookie实现的sso单点登录
博主刚接触.NET Core2.0,想做一个单点登录的demo,所以参考了一些资料,这里给上链接:
1.http://www.cnblogs.com/baibaomen/p/sso-sequence-chart.html
2.https://www.cnblogs.com/ywlaker/p/6113927.html
于是开始项目:
首先,既然是单点登录,就得建立多个站点,实现多个系统一次登录/注销。
直接看解决方案
sso_server用于统一登录
这边思路不再多说,上面的两篇帖子说的比较清楚。
既然使用session,那么,就得在startup中添加:
当然,所有用到session的项目,都需要这么添加一下(个人觉得有点麻烦,有更好的方法,也请告知,感谢)
然后是system1,system2的代码(这里两个系统没有差别)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; namespace SSO_Server.Controllers
{
public class LoginController : Controller
{
public IActionResult Index(string returnUrl)
{
//浏览器带过来的cookie,token值
string browsertoken = HttpContext.Request.Cookies["token"];
//不存在,则判断未登录
if (string.IsNullOrEmpty(browsertoken) || string.IsNullOrEmpty(HttpContext.Session.GetString(browsertoken)))
{
ViewData["Message"] = "请登录";
}
else
{
string url = HttpContext.Session.GetString(browsertoken) + ",";
//将请求的url注册
HttpContext.Session.SetString(browsertoken, url + returnUrl);
//存在token,判断已登录,返回用户信息
return Redirect(returnUrl + "?token=" + browsertoken + "&uid=" + "");
//return Content(returnUrl + "?token=" + browsertoken + "&uid=" + "1234");
}
return View();
} public IActionResult SignIn(string returnUrl)
{
//保存用户信息
HttpContext.Session.SetString("uid","");
//生成token
string token = Guid.NewGuid().ToString();
//将请求的url注册
HttpContext.Session.SetString(token, returnUrl);
//写入浏览器token
HttpContext.Response.Cookies.Append("token",token);
if (string.IsNullOrWhiteSpace(returnUrl))
{
returnUrl = "http://sysone.yourdomain.cn";
}
//返回token和用户信息到请求地址
return Redirect(returnUrl+"?token="+ token+"&uid="+"");
} public IActionResult sessiontoken()
{
string browsertoken = HttpContext.Request.Cookies["token"];
string s= HttpContext.Session.GetString(browsertoken);
return Content(s);
} public IActionResult SignOut(string returnUrl)
{
string cont = string.Empty;
string nexturl = string.Empty;
string browsertoken = HttpContext.Request.Cookies["token"];
if (!string.IsNullOrEmpty(HttpContext.Session.GetString(browsertoken)))
{
string urlstr = HttpContext.Session.GetString(browsertoken);
//string urlstr = "http://sysone.yourdomain.cn,http://systwo.yourdomain.cn";
string[] ulslist = urlstr.Split(',');
List<string> arrstr = ulslist.Distinct().ToList();
if (arrstr.Count() > && !string.IsNullOrEmpty(arrstr[]))
{
nexturl = arrstr[] + "/Home/SignOut";
cont = string.Join(",", arrstr);
}
}
HttpContext.Response.Cookies.Delete("token");
HttpContext.Session.Clear();
//return Content(nexturl + "?returnUrl=" + returnUrl + "&cont=" + cont);
if (!string.IsNullOrEmpty(nexturl))
return Redirect(nexturl + "?returnUrl=" + returnUrl + "&cont=" + cont);
else
return Redirect(returnUrl);
}
}
}
然后是视图
@{
ViewData["Title"] = "Home Page";
}
@ViewData["Message"]
@if (!ViewData["Message"].ToString().Equals("请登录"))
{
<a href="http://sso.yourdomain.cn/Login/SignOut?returnUrl=http://sysone.yourdomain.cn">注销</a>
}
else
{
<a class="btn btn-default" href="http://sso.yourdomain.cn/login?returnUrl=http://sysone.yourdomain.cn">登录</a>
}
然后是sso认证中心代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; namespace SSO_Server.Controllers
{
public class LoginController : Controller
{
public IActionResult Index(string returnUrl)
{
//浏览器带过来的cookie,token值
string browsertoken = HttpContext.Request.Cookies["token"];
//不存在,则判断未登录
if (string.IsNullOrEmpty(browsertoken) || string.IsNullOrEmpty(HttpContext.Session.GetString(browsertoken)))
{
ViewData["Message"] = "请登录";
}
else
{
string url = HttpContext.Session.GetString(browsertoken) + ",";
//将请求的url注册
HttpContext.Session.SetString(browsertoken, url + returnUrl);
//存在token,判断已登录,返回用户信息
return Redirect(returnUrl + "?token=" + browsertoken + "&uid=" + "");
//return Content(returnUrl + "?token=" + browsertoken + "&uid=" + "1234");
}
return View();
} public IActionResult SignIn(string returnUrl)
{
//保存用户信息
HttpContext.Session.SetString("uid","");
//生成token
string token = Guid.NewGuid().ToString();
//将请求的url注册
HttpContext.Session.SetString(token, returnUrl);
//写入浏览器token
HttpContext.Response.Cookies.Append("token",token);
if (string.IsNullOrWhiteSpace(returnUrl))
{
returnUrl = "http://sysone.yourdomain.cn";
}
//返回token和用户信息到请求地址
return Redirect(returnUrl+"?token="+ token+"&uid="+"");
} public IActionResult sessiontoken()
{
string browsertoken = HttpContext.Request.Cookies["token"];
string s= HttpContext.Session.GetString(browsertoken);
return Content(s);
} public IActionResult SignOut(string returnUrl)
{
string cont = string.Empty;
string nexturl = string.Empty;
string browsertoken = HttpContext.Request.Cookies["token"];
if (!string.IsNullOrEmpty(HttpContext.Session.GetString(browsertoken)))
{
string urlstr = HttpContext.Session.GetString(browsertoken);
//string urlstr = "http://sysone.yourdomain.cn,http://systwo.yourdomain.cn";
string[] ulslist = urlstr.Split(',');
List<string> arrstr = ulslist.Distinct().ToList();
if (arrstr.Count() > && !string.IsNullOrEmpty(arrstr[]))
{
nexturl = arrstr[] + "/Home/SignOut";
cont = string.Join(",", arrstr);
}
}
HttpContext.Response.Cookies.Delete("token");
HttpContext.Session.Clear();
//return Content(nexturl + "?returnUrl=" + returnUrl + "&cont=" + cont);
if (!string.IsNullOrEmpty(nexturl))
return Redirect(nexturl + "?returnUrl=" + returnUrl + "&cont=" + cont);
else
return Redirect(returnUrl);
}
}
}
sso,登录页视图index
@{
ViewData["Title"] = "登录";
}
@ViewData["Message"]
@if (!ViewData["Message"].ToString().Equals("请登录"))
{
<a href="@Url.Action("SignOut")">注销</a>
}
else
{
<a class="btn btn-default" href="@Url.Action("SignIn","Login",new { returnUrl=Context.Request.Query["returnUrl"]})">登录</a>
}
@ViewData["Message1"]
这里贴上资源链接
https://download.csdn.net/download/qq_28248571/10342173
这里只是初步demo,请不要钻牛角尖,欢迎讨论,感谢你的阅读
.NET Core2.0+MVC 用session,cookie实现的sso单点登录的更多相关文章
- .NET Core2.0+MVC 用Redis/Memory+cookie实现的sso单点登录
之前发布过使用session+cookie实现的单点登录,博主个人用的很不舒服,为什么呢,博主自己测试的时候,通过修改host的方法,在本机发布了三个站点,但是,经过测试,发现,三个站点使用的sess ...
- NET Core 2.0使用Cookie认证实现SSO单点登录
NET Core 2.0使用Cookie认证实现SSO单点登录 之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sa ...
- asp.net 配置二级域名的共享session,并实现sso单点登录
公司最近做了一个新网站.原先网站的网址是www.xxxx.com.新做的网站要部署到info.xxxx.com.这两个网站要实现单点登录.而新老网站本身机构的原因,对于登录状态的判断,说白了就是对于s ...
- ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NE ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...
- sso单点登录系统(解决session共享)
场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...
- Asp.Net Core基于Cookie实现同域单点登录(SSO)
在同一个域名下有很多子系统 如:a.giant.com b.giant.com c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...
- oauth2.0实现sso单点登录的方式和相关代码
SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...
- 前端分享之cookie的使用及单点登录
cookie是什么 cookie的英文意思是饼干.在计算机术语中指服务端存放在客户端的一段数据.这段数据在客户端每次进行http请求时会自动加在http请求报文中的header上:服务端在响应时,可以 ...
随机推荐
- 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1
最近发现,开发的Web应用在客户的某些IE(8,9,11)中弹出不了Windows的字体对话框. 通过 F12 跟踪,错误代码是“-2146827850”,错误信息是“ 对象不支持ShowFont属性 ...
- 让Myeclipse自动生成的get set方法 自动加上文本注释,并且注释内容包含字段中我们加的文档注释
在进行编码写实体类的时候发现,一个实体类有好多的字段要进行注释,他们都是私有的不能直接访问,我们在写的时候加入的文档注释也起不到效果,但是自动生成的get,set方法的文档注释有不符合我们要求(没有包 ...
- 使用.NET开发AutoCAD——设计师不做画图匠(一)
(一)前言--如何避免加班那些事 我是谁?我是一名工程设计师,有点"不务正业",在工作之余长期从事软件开发工作,开发了公路铁路行业广泛应用的设计软件.说正题之前,聊聊加班那些事.话 ...
- Beta 第六天
今天遇到的困难: github服务器响应很慢 推图的API接口相应较慢,超过了初始设定的最大延迟时间,导致了无法正确返回图片 ListView滑动删除Demo出现了某些Bug,这些Bug可能导致了某些 ...
- Git学习使用
1.注册码云并建立远程仓库 2.安装git 3.使用eclipse egit 推送以及克隆 建立本地仓库,成功后如图 推送项目至本地仓库与远程仓库 使用右键菜单team-share 选项,与仓库关联后 ...
- listview、gradview滚动到最后时,滑动至顶部
listview.gradview滑动顶端.底部的判断及底部滑动至顶端 mPhotoWall.setOnScrollListener(new AbsListView.OnScrollListener( ...
- Unix下zfs文件系统重组RAID-5后可以这样恢复
存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...
- 如何进行服务器Linux系统下的ext文件系统修复
一.故障描述 服务器是dell 730系列服务器,存储阵列是MD3200系列存储5T的Lun,操作系统是Linux centos 7,文件系统类型是EXT4,因意外断电,导致系统不能正常启动,修复之后 ...
- 在wamp集成环境下安装laravel5.2.*框架
虽然官方一直强烈推荐使用homestead,但是这个相对麻烦一点,所以我还是选择使用wamp集成开发环境.还有这里我只讲解windows系统下的安装,其他例如mac或linux就不写了,此文章是面向刚 ...
- slf4j 与 log4j2 基本用法
简单的说 log4j2 是log4j2的升级版,解决了部分性能问题和部分死锁问题,其使用方式与使用配置与log4j相同. 建议使用maven依赖直接使用log4j2 <dependency> ...