.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=" + "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>
}
View Code

然后是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);
        }
    }
}
View Code

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"]
View Code

這里貼上資源鏈接

https://download.csdn.net/download/qq_28248571/10342173

這里只是初步demo,請不要鑽牛角尖,歡迎討論,感謝你的閱讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM