.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上:服务端在响应时,可以 ...
随机推荐
- Javascript中几个看起来简单,却不一定会做的题
Javascript作为前端开发必须掌握的一门语言,因为语言的灵活性,有些知识点看起来简单,在真正遇到的时候,却不一定会直接做出来,今天我们就一起来看看几道题目吧 题目1 var val = 'smt ...
- iOS移动端直连数据库
一个可以直接连接服务器MySQL的工具包(极不安全,如非特殊需求,不推荐使用) 这种直接连接服务器数据的方式是极为不安全的,但因为我们这个项目特殊情况,只在局域网内使用, 且只有一个pad对一台设备进 ...
- [BZOJ 1297][SCOI2009]迷路
1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1418 Solved: 1017[Submit][Status ...
- 【备忘】Idea的那些事
说到Java的IDE,似乎eclipse和Idea是目前的主流.然而,OO的课程组却一直在推荐使用eclipse,于是很多人就这样错过了Idea这样强大的IDE工具.本文将会对于Idea和Idea的一 ...
- machine learning 之 多元线性回归
整理自Andrew Ng的machine learning课程 week2. 目录: 多元线性回归 Multivariates linear regression /MLR Gradient desc ...
- uboot中的命令体系
一.uboot的命令体系介绍以及实例分析: U-Boot 的命令实现大多在 common 目录下.在该目录下命令的代码文件都是以“ cmd_”开头的,如下图所示: 其中每一个文件都是一个命令实现的代码 ...
- JavaScript(第三十天)【XPath】
XPath是一种节点查找手段,对比之前使用标准DOM去查找XML中的节点方式,大大降低了查找难度,方便开发者使用.但是,DOM3级以前的标准并没有就XPath做出规范:直到DOM3在首次推荐到标准规范 ...
- JavaScript(第三天)【数据类型】
学习要点: 1.typeof操作符 2.Undefined类型 3.Null类型 4.Boolean类型 5.Number类型 6.String类型 7.Object类型 ECMAScript中有5种 ...
- alpha-咸鱼冲刺day1
一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花!) 四,问题 ...
- DenseNet
特点: dense shortcut connections 结构: DenseNet 是一种具有密集连接的卷积神经网络.在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有 ...