博主刚接触.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=" + "1234"); //return Content(returnUrl + "?token=" + browsertoken + "&uid=" + "1234"); } return View(); } public IActionResult SignIn(string returnUrl) { //保存用户信息 HttpContext.Session.SetString("uid","1234"); //生成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="+"1234"); } 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() > 0 && !string.IsNullOrEmpty(arrstr[0])) { nexturl = arrstr[0] + "/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=" + "1234"); //return Content(returnUrl + "?token=" + browsertoken + "&uid=" + "1234"); } return View(); } public IActionResult SignIn(string returnUrl) { //保存用户信息 HttpContext.Session.SetString("uid","1234"); //生成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="+"1234"); } 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() > 0 && !string.IsNullOrEmpty(arrstr[0])) { nexturl = arrstr[0] + "/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,请不要钻牛角尖,欢迎讨论,感谢你的阅读