亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談?wù)l都能看懂的單點登錄(SSO)實現(xiàn)方式(附源碼)

 更新時間:2016年12月05日 16:40:39   作者:Qi Fei  
這篇文章主要介紹了淺談?wù)l都能看懂的單點登錄(SSO)實現(xiàn)方式(附源碼),具有一定的參考價值,有需要的可以了解一下。

SSO的基本概念

SSO英文全稱Single Sign On(單點登錄)。SSO是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。它包括可以將這次主要的登錄映射到其他應(yīng)用中用于同一個用戶的登錄的機制。它是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。(本段內(nèi)容來自百度百科)

今天這篇文章將介紹SSO的一種實現(xiàn)方式,代碼超簡單,僅用來驗證我的思路是否可行,具體細節(jié)請大家來完善!

二級域名的單點登錄

什么是二級域名呢?例如:

  • site1.domain.com
  • site2.domain.com

對于二級域名的單點登錄,我們可以非常方便的通過共享cookie來實現(xiàn),簡單的說,就是在設(shè)置Form票據(jù)的時候,將cookie的domain設(shè)置為頂級域名即可,例如:

HttpCookie cookie = new HttpCookie(FormsAuthCookieName, encryptedTicket);
cookie.Expires = rememberMe ? expirationDate : DateTime.MinValue;
cookie.HttpOnly = true;
cookie.Path = "/";
cookie.Domain = "domain.com";
context.Response.Cookies.Set(cookie);

這種方式不涉及跨域,當(dāng)cookie的domain屬性設(shè)置為頂級域名之后,所有的二級域名都可以訪問到身份驗證的cookie,在服務(wù)器端只要驗證了這個cookie就可以實現(xiàn)身份的驗證。

但是,當(dāng)跨域的時候,例如:

  • site1.com
  • site2.com

這個時候就不能共享cookie了,所以上面的解決方案就會失效。那么,要實現(xiàn)跨域的單點登錄該如何做呢?請繼續(xù)往下看。

跨域的單點登錄

關(guān)于跨域的SSO的設(shè)計思路,我畫了一個簡單的流程圖:

首先,我將跨域的SSO分為SSO-Server和SSO-Client兩個部分,SSO-Client可以是多個的。

SSO-Server

SSO-Server主要負責(zé)用戶登錄、注銷、為SSO-Client分配taken、驗證taken的工作。

登錄和注銷采用的是Form認證方式,很多地方都有詳細的介紹。

SSO-Server分配Token

為SSO-Client分配Token的部分,在SSO-Client請求SSO受信頁面的時候,檢查SSO-Server是否登錄,如果沒有登錄則跳轉(zhuǎn)到SSO-Server的登錄頁面,如果已登錄,則執(zhí)行分配Token的代碼,在分配完成以后將TokenID作為參數(shù)添加到returnUrl中,并跳轉(zhuǎn)到returnUrl,具體的分配代碼如下:

if (Domain.Security.SmartAuthenticate.LoginUser != null)
{
  //生成Token,并持久化Token
  Domain.SSO.Entity.SSOToken token = new Entity.SSOToken();
  
  token.User = new Entity.SSOUser();
  token.User.UserName = Domain.Security.SmartAuthenticate.LoginUser.UserName;
  token.LoginID = Session.SessionID;
  Domain.SSO.Entity.SSOToken.SSOTokenList.Add(token);

  //拼接返回的url,參數(shù)中帶Token
  string spliter = returnUrl.Contains('?') ? "&" : "?";
  returnUrl = returnUrl + spliter + "token=" + token.ID;
  Response.Redirect(returnUrl);
}

當(dāng)完成Token分配之后,頁面將帶有TokenID的參數(shù)跳轉(zhuǎn)到SSO-Client頁面,并在SSO-Client的Cookie中添加Token值,在以后的每次請求中,SSO-Client通過調(diào)用SSO-Server的服務(wù)來驗證Token的合法性。

SSO-Server驗證Token

我是通過WebService來驗證Token的。

首先在SSO-Server定義一個Web Service:

[WebMethod]
public Entity.SSOToken ValidateToken(string tokenID)
{
  if (!KeepToken(tokenID))
    return null;

  var token = Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m => m.ID == tokenID);
  return token;
}

[WebMethod]
public bool KeepToken(string tokenID)
{
  var token = Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m => m.ID == tokenID);
  if (token == null)
    return false;
  if (token.IsTimeOut())
    return false;

  token.AuthTime = DateTime.Now;
  return true;
}

ValidateToken用來驗證TokenID的合法性,KeepToken用來保持Token不會過期。

SSO-Client通過調(diào)用Validate驗證Token,并得到當(dāng)前的登錄用戶信息。接下來看看SSO-Client的實現(xiàn)。

SSO-Client

SSO-Client作為受信系統(tǒng)來存在的,它自己沒有認證系統(tǒng),只能通過SSO-Server來完成用戶身份認證的工作。

當(dāng)用戶請求SSO-Client的受保護資源時,SSO-Client會首先是否有TokenID,如果存在TokenID,則調(diào)用SSO-Server的WebService來驗證這個TokenID是否合法;

驗證成功以后將會返回SSOToken的實例,里面包含已登錄的用戶信息。具體代碼如下:

if (!string.IsNullOrEmpty(tokenID))
{
  AuthTokenService.AuthTokenServiceSoapClient client = new AuthTokenService.AuthTokenServiceSoapClient();
  var token = client.ValidateToken(tokenID);
  if (token != null)
  {
    this.lblMessage.Text = "登錄成功,登錄用戶:"
      + token.User.UserName
      + "<a 
      + Server.UrlEncode("http://sso-client.com")
      + "'>退出</a>";
  }
  else
  {
    Response.Redirect("http://sso-server.com/sso.aspx?returnUrl=" +
      Server.UrlEncode("http://sso-client.com/default.aspx"));
  }
}
else
{
  Response.Redirect("http://sso-server.com/sso.aspx?returnUrl=" +
    Server.UrlEncode("http://sso-client.com/default.aspx"));
}

源代碼

文章中已經(jīng)介紹了我的具體思路和一些實現(xiàn),如果你仍然感興趣,可以下載我的代碼>>Demo.SSO

源代碼的部署:

1. 在IIS中創(chuàng)建兩個站點,分別綁定到SSO-Server和SSO-Client,它們綁定的域名分別是sso-server.com和sso-client.com

2. 在hosts文件中添加兩行映射,將sso-server.com和sso-client.com映射到127.0.0.1,確??梢栽L問

3.訪問sso-client.com,這個時候頁面將跳轉(zhuǎn)到sso-server.com的登錄頁面,用戶名、密碼隨便輸入,然后點擊登錄即可

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。 

相關(guān)文章

  • ASP.NET MVC5網(wǎng)站開發(fā)我的咨詢列表及添加咨詢(十二)

    ASP.NET MVC5網(wǎng)站開發(fā)我的咨詢列表及添加咨詢(十二)

    這篇文章主要為大家詳細介紹了ASP.NET MVC5網(wǎng)站開發(fā)我的咨詢列表及添加咨詢,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • ASP.NET?MVC開發(fā)接入微信公共平臺

    ASP.NET?MVC開發(fā)接入微信公共平臺

    這篇文章主要為大家介紹了微信平臺開發(fā)ASP.NET?MVC接入微信公共平臺實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • ASP.NET中實現(xiàn)獲取調(diào)用方法名

    ASP.NET中實現(xiàn)獲取調(diào)用方法名

    這篇文章主要介紹了ASP.NET中實現(xiàn)獲取調(diào)用方法名的技巧,較為詳細的講述了相關(guān)的命名空間的調(diào)用及語句執(zhí)行順序,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • WPF使用VisualTreeHelper進行命中測試

    WPF使用VisualTreeHelper進行命中測試

    這篇文章介紹了WPF使用VisualTreeHelper進行命中測試的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • asp.net 簡單工廠模式和工廠方法模式之論述

    asp.net 簡單工廠模式和工廠方法模式之論述

    簡單工廠模式的最大優(yōu)點在于工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動態(tài)實例化相關(guān)的類,對于客戶端來說,去除了于具體產(chǎn)品的依賴
    2011-12-12
  • 詳解ASP.NET七大身份驗證方式以及解決方案

    詳解ASP.NET七大身份驗證方式以及解決方案

    這篇文章主要為大家詳細介紹了ASP.NET七大身份驗證方式以及解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • .NET?Framework?的項目如何使用?FTP?下載文件

    .NET?Framework?的項目如何使用?FTP?下載文件

    本文專門針對面向?.NET?Framework?的項目,?對于面向?.NET?6?及更高版本的項目,不再支持?FTP,此示例演示如何從?FTP?服務(wù)器下載文件,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • dhtmlxGrid 添加行號詳細步驟

    dhtmlxGrid 添加行號詳細步驟

    接下來將介紹dhtmlxGrid 添加行號首先設(shè)置屬性(設(shè)置gridView屬性:gridView1 .IndicatorWidth=30)/再添加事件等等感興趣的你可以參考下
    2013-03-03
  • MVC4制作網(wǎng)站教程第一篇 緒論

    MVC4制作網(wǎng)站教程第一篇 緒論

    MVC4制作網(wǎng)站教程第一篇,創(chuàng)建項目,網(wǎng)站配置,從最基本的操作入手,幫助大家了解MVC4網(wǎng)站入門制作的過程,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論