一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 淺談誰都能看懂的單點登錄(SSO)實現方式(附源碼)

淺談誰都能看懂的單點登錄(SSO)實現方式(附源碼)

2020-04-07 12:51Qi Fei ASP.NET教程

這篇文章主要介紹了淺談誰都能看懂的單點登錄(SSO)實現方式(附源碼),具有一定的參考價值,有需要的可以了解一下。

SSO的基本概念

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

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

二級域名的單點登錄

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

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

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

?
1
2
3
4
5
6
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);

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

但是,當跨域的時候,例如:

  • site1.com
  • site2.com

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

跨域的單點登錄

關于跨域的SSO的設計思路,我畫了一個簡單的流程圖:

淺談誰都能看懂的單點登錄(SSO)實現方式(附源碼)

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

SSO-Server

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

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

SSO-Server分配Token

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,參數中帶Token
  string spliter = returnUrl.Contains('?') ? "&" : "?";
  returnUrl = returnUrl + spliter + "token=" + token.ID;
  Response.Redirect(returnUrl);
}

當完成Token分配之后,頁面將帶有TokenID的參數跳轉到SSO-Client頁面,并在SSO-Client的Cookie中添加Token值,在以后的每次請求中,SSO-Client通過調用SSO-Server的服務來驗證Token的合法性。

SSO-Server驗證Token

我是通過WebService來驗證Token的。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[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通過調用Validate驗證Token,并得到當前的登錄用戶信息。接下來看看SSO-Client的實現。

SSO-Client

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (!string.IsNullOrEmpty(tokenID))
{
  AuthTokenService.AuthTokenServiceSoapClient client = new AuthTokenService.AuthTokenServiceSoapClient();
  var token = client.ValidateToken(tokenID);
  if (token != null)
  {
    this.lblMessage.Text = "登錄成功,登錄用戶:"
      + token.User.UserName
      + 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
{
    Server.UrlEncode("http://sso-client.com/default.aspx"));
}

源代碼

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

源代碼的部署:

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

2. 在hosts文件中添加兩行映射,將sso-server.com和sso-client.com映射到127.0.0.1,確保可以訪問

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。 

原文鏈接:http://www.cnblogs.com/youring2/p/sso-practice.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩精品欧美激情国产一区 | 久久久久国产一级毛片高清片 | 天天干夜夜拍 | 999精品视频在线观看热6 | 亚洲六月丁香六月婷婷色伊人 | 苍井空色欲迷墙 | 亚洲人的天堂男人爽爽爽 | 暖暖在线精品日本中文 | 国产日韩欧美精品在线 | s0e一923春菜花在线播放 | 成年男女免费视频网站 | 深夜影院深a久久 | 国产成+人+综合+亚洲欧美丁香花 | 男女男精品视频免费观看 | 亚洲激情综合 | 久久九九有精品国产23百花影院 | 变态人shou交小说 | 福利国产精品 | 亚洲精品国产精品麻豆99 | 五月天精品视频在线观看 | 成年人黄视频在线观看 | 男人在线网址 | 男人天堂网www | 99久久综合久中文字幕 | 亚洲精品中文 | 久久免费观看视频 | 九九热免费在线观看 | 91精品国产综合久久精品 | 日韩欧美精品一区二区 | 日韩欧美一区二区在线 | 国产清纯白嫩大学生正在播放 | 男女男精品视频网站 | 亚洲国产成人精品无码区APP | 精品久久成人免费第三区 | 好男人资源免费播放在线观看 | 男人插曲女人下面 | 深夜视频免费看 | 日本一区二区三区视频在线观看 | 欧美靠逼| 欧美日韩亚洲另类人人澡 | 成人久久18免费网站入口 |