博主刚接触.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单点登录的更多相关文章

  1. .NET Core2.0+MVC 用Redis/Memory+cookie实现的sso单点登录

    之前发布过使用session+cookie实现的单点登录,博主个人用的很不舒服,为什么呢,博主自己测试的时候,通过修改host的方法,在本机发布了三个站点,但是,经过测试,发现,三个站点使用的sess ...

  2. NET Core 2.0使用Cookie认证实现SSO单点登录

    NET Core 2.0使用Cookie认证实现SSO单点登录 之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sa ...

  3. asp.net 配置二级域名的共享session,并实现sso单点登录

    公司最近做了一个新网站.原先网站的网址是www.xxxx.com.新做的网站要部署到info.xxxx.com.这两个网站要实现单点登录.而新老网站本身机构的原因,对于登录状态的判断,说白了就是对于s ...

  4. ASP.NET Core 2.0使用Cookie认证实现SSO单点登录

    之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NE ...

  5. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  6. sso单点登录系统(解决session共享)

    场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...

  7. Asp.Net Core基于Cookie实现同域单点登录(SSO)

    在同一个域名下有很多子系统 如:a.giant.com  b.giant.com   c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...

  8. oauth2.0实现sso单点登录的方式和相关代码

    SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...

  9. 前端分享之cookie的使用及单点登录

    cookie是什么 cookie的英文意思是饼干.在计算机术语中指服务端存放在客户端的一段数据.这段数据在客户端每次进行http请求时会自动加在http请求报文中的header上:服务端在响应时,可以 ...

随机推荐

  1. Myeclipse快速补充返回值快捷键

    比如 image.getGraphics(); 按ALT+Shift+L键,弹出一个确认变量名称框,确认之后会补全语句Graphics graphics = image.getGraphics();

  2. 本地不安装oracle,PLsql远程连接

    Oracle的Instant client工具包可以很好地解决本地不安装oracle,PLsql远程连接. 1.首先到Oracle网站下载Instant Client : http://www.ora ...

  3. 指令-arModal-点击提示框模板

    html 使用<ar-modal></ar-modal>: <ar-modal modal-obj="modalObj" ok="newAl ...

  4. C作业--数据类型

    一.PTA实验作业 题目1:7-3 倒顺数字串 1. 本题PTA提交列表 2. 设计思路(伪代码) (1)本题是要求输入倒顺序数串,首先看到这种题肯定是需要用到循环,那就先定一个整形i来进行循环,n是 ...

  5. 用python实现简单购物车功能

    all_asset = 0 i1 = input("请输入总资产:") all_asset = int(i1) goods = [ {'name':'电脑','price':199 ...

  6. 乐动力APP案例

    第一部分 调研, 评测 下载软件并使用起来,描述最简单直观的个人第一次上手体验. 这款软件的主界面功能还是比较完善,里面有多个关于运动相关的数据,还有一些推荐健身教程,记录功能也十分不错,其中最难理解 ...

  7. 第三篇:Python字符编码

    一 .了解字符编码的知识储备 1计算机基础知识 1.2文本编辑器存取文件的原理(nodepat++,Pycharm,word) #.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...

  8. mint-ui在vue中的使用。

    首先放上mint-ui中文文档 近来在使用mint-ui,发现部分插件在讲解上并不是很详细,部分实例找不到使用的代码.github上面的分享,里面都是markdown文件,内容就是网上的文档 刚好自己 ...

  9. OO第一次总结

    第一次作业: 第一次作业的指导书发下来之后我按着上面的步骤一步一步的做了之后发现项目拉下来了,怎么开始码代码呢...然后在舍友的帮助下才知道怎么建包建类,然后对Java的语法又不是很了解,于是就先把C ...

  10. 我自己总结的C#开发命名规范整理了一份

    我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报  分类: C#(39)  版权声明:本文为博主原创文章, ...