博主刚接触.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. 浅析Python3中的bytes和str类型

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...

  2. 修改GeoJson的网址

    http://geojson.io       可以打开自己的json  然后修改

  3. 基于Multiple treatment的营销评估算法

    营销是发现或挖掘准消费者和众多商家需求,通过对自身商品和服务的优化和定制,进而推广.传播和销售产品,实现最大化利益的过程.例如,银行可通过免息卡或降价对处在分期意愿边缘的用户进行营销,促使其分期进而提 ...

  4. 201621123060《JAVA程序设计》第一周学习总结

    1.本周学习总结 1.讲述了JAVA的发展史,关于JDK.JRE.JVM的联系和区别 2.JDK是用JAVA开发工具.做项目的关键.JRE是JAVA的运行环境(JAVA也是JAVA语言开发的).JVM ...

  5. 201621123031 《Java程序设计》第7周学习总结

    作业07-Java GUI编程 1.本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 事件监听器: Java事件监听器是由事件类和监听接口组成,自定义 ...

  6. 使用XIB实现嵌套自定义视图

    在进行iOS开发的过程中,对于一些复杂的界面,我们可以通过Interface Builder这个Xcode集成的可视化界面编辑工具在完成,这回节省大部分时间以及代码量.它的使用方法这里不做介绍了,这次 ...

  7. WingIDE5.*注册破解方法

    WingIDE是Python程序语言设计的集成开发环境,具有语法标签高亮显示,命令自动完成和函数跳转列表等非常强大的功能.本文主要介绍WingIDE 5安装及注册破解方法. 1. WingIDE 5下 ...

  8. 关于mule中使用jdbc时报No Suitable Driver found错误的问题

    错误大概信息: Exception in thread "main" org.mule.module.launcher.DeploymentStartException: SQLE ...

  9. nyoj Mod

    Ocean用巧妙的方法得到了一个序列,该序列有N个元素,我们用数组a来记录(下标从0到N−1). Ocean定义f[i]=(((i%a[0])%a[1])%-)%a[N−1]. 现在Ocean会给出Q ...

  10. JAVA_SE基础——72.自定义线程

    进程 :  正在执行的程序称作为一个进程.  进程负责了内存空间的划分.   问题: windows号称是多任务的操作系统,那么windows是同时运行多个应用程序吗?从宏观的角度: windows确 ...