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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - 淺談?wù)l都能看懂的單點(diǎn)登錄(SSO)實(shí)現(xiàn)方式(附源碼)

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

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

這篇文章主要介紹了淺談?wù)l都能看懂的單點(diǎn)登錄(SSO)實(shí)現(xiàn)方式(附源碼),具有一定的參考價(jià)值,有需要的可以了解一下。

SSO的基本概念

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

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

二級(jí)域名的單點(diǎn)登錄

什么是二級(jí)域名呢?例如:

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

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

?
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);

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

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

  • site1.com
  • site2.com

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

跨域的單點(diǎn)登錄

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

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

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

SSO-Server

SSO-Server主要負(fù)責(zé)用戶登錄、注銷(xiāo)、為SSO-Client分配taken、驗(yàn)證taken的工作。

登錄和注銷(xiāo)采用的是Form認(rèn)證方式,很多地方都有詳細(xì)的介紹。

SSO-Server分配Token

為SSO-Client分配Token的部分,在SSO-Client請(qǐng)求SSO受信頁(yè)面的時(shí)候,檢查SSO-Server是否登錄,如果沒(méi)有登錄則跳轉(zhuǎn)到SSO-Server的登錄頁(yè)面,如果已登錄,則執(zhí)行分配Token的代碼,在分配完成以后將TokenID作為參數(shù)添加到returnUrl中,并跳轉(zhuǎn)到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,參數(shù)中帶Token
  string spliter = returnUrl.Contains('?') ? "&" : "?";
  returnUrl = returnUrl + spliter + "token=" + token.ID;
  Response.Redirect(returnUrl);
}

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

SSO-Server驗(yàn)證Token

我是通過(guò)WebService來(lái)驗(yàn)證Token的。

首先在SSO-Server定義一個(gè)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用來(lái)驗(yàn)證TokenID的合法性,KeepToken用來(lái)保持Token不會(huì)過(guò)期。

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

SSO-Client

SSO-Client作為受信系統(tǒng)來(lái)存在的,它自己沒(méi)有認(rèn)證系統(tǒng),只能通過(guò)SSO-Server來(lái)完成用戶身份認(rèn)證的工作。

當(dāng)用戶請(qǐng)求SSO-Client的受保護(hù)資源時(shí),SSO-Client會(huì)首先是否有TokenID,如果存在TokenID,則調(diào)用SSO-Server的WebService來(lái)驗(yàn)證這個(gè)TokenID是否合法;

驗(yàn)證成功以后將會(huì)返回SSOToken的實(shí)例,里面包含已登錄的用戶信息。具體代碼如下:

?
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"));
}

源代碼

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

源代碼的部署:

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本草草视频在线观看 | 国产精品每日在线观看男人的天堂 | 欧美综合影院 | 日本护士撒尿xxxxhd | 国产成人激情视频 | 男人影院天堂网址 | 77色视频在线 | 91免费高清无砖码区 | yjsp妖精视频在线观看免费 | 第一次处破女18分钟 | 国产一区二区三区久久精品 | 国产伦码精品一区二区 | 亚洲国产成人久久99精品 | 2021小妲己永久回家地址 | 美女跪式抽搐gif动态图 | 天天操精品视频 | 国产亚洲精品一区二区在线观看 | 91亚洲视频在线观看 | 暖暖高清日本在线 | 乌克兰bbw | 日韩欧美一卡二区 | 欧美一区二区三区四区在线观看 | 男男调教打屁股 | 欧美成人免费观看bbb | 成人男女啪啪免费观看网站 | 日本卡1卡2卡4卡免费 | 性刺激欧美三级在线现看中文 | 国产大乳美女挤奶视频 | 日本妇人成熟免费观看18 | 国产精品亚洲精品日韩已方 | 国产欧美一区二区精品久久久 | 天堂a免费视频在线观看 | 亚洲国产果果在线播放在线 | 羞羞视频麻豆 | 天堂资源在线www中文 | 91aaa免费免费国产在线观看 | 国产精品一级片 | 波多野结衣一区免费作品 | 四虎地址 | 亚洲成年男人的天堂网 | 花唇肿胀无法合拢双性 |