天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

跨域SSO的實現之一:架構設計

  翻譯自CodeProject網站ASP.NET9月份最佳文章:Single Sign On (SSO) for cross-domain ASP.NET applications。

  翻譯不妥之處還望大家多多指導、相互交流。

  文章分為兩部分:架構設計和程序實現,此為第一篇即:架構設計或者叫設計藍圖(Part-I - The design blue print)。:)

  簡介

  周一的早晨,當你正在納悶周末咋就一眨眼過去了并對接下來漫長的一周感到無比蛋疼之時,你收到了一份Email。

  操蛋的是它既不是微軟的offer也不是Google的offer,而是客戶發來的一個新需求。

  他說你們現在幫我們公司做了很多的ASP.NET的網站和忽悠我們上線的各種系統,現在我想要我的客戶只要在我們擁有的任何一個網站上登錄一次,那么在我所有的網站上該用戶就都已經登錄了,同樣,隨便他從哪個網站上注銷掉,那么他也就從我們所有的網站上注銷了......

  你受不了客戶這么羅嗦了,心想不就是要一個SSO功能嗎?使用ASP.NET的form authentication不就可以實現了?因為這樣可以在同域的不用網站下共享cookie,只需要在machineKey設置一樣的配置節就可以了。放狗一搜,果然有xxxx條結果。放狗找東西可是我們程序員的特長。

  開工前,你又掃了一眼郵件,等等,你看到了郵件中的一行話,微微一蛋疼:我們部署了那些網站,但不是都在同一個域名下。

  你的客戶狠狠地給你來了個下馬威,好像他早就放狗搜過,因為cookie不能跨域共享,也就不能用來實現跨域驗證了。

  這到底是神馬一回事情!(和老外一樣扯玩淡,下面正經些)

  ASP.NET中的驗證原理

  這個問題可能是老生常談了,但在解決難題之前,還是先回歸基礎來看一看事物的本質到底是如何的。因此,我們重溫一下ASP.NET表單驗證的原理也并不壞。
  下面是ASP.NET表單驗證的流程圖

  驗證流程

  1:你訪問一個需要用戶驗證的ASP.NET頁面

  2:在此請求中ASP.NET運行時開始查找cookie(由于表單驗證的cookie),如果沒有查找到,那么將跳轉到登錄頁面(登錄頁地址配置在了web.config文件中)

  3:在登錄頁面中,你提供了相關的驗證憑證并點擊了登錄按鈕,系統和已存儲的數據對比驗證成功后,將Thread.CurrentPrincipal.Identity.Name的屬性值設置成了你提供的用戶名,并在Response中寫入了cookie(同時還寫入了用戶信息和一些如cookie名,失效日期等),并重定向到登錄前的頁面。

  4:當你再點擊其他的頁面(或者點擊導航到其他的頁面),瀏覽器發送驗證的cookie(也可能包含在該網站下寫入的一些其他cookie),這一次已經包含了在上一次response中上次驗證獲取到的cookie。

  5:和以前一樣,ASP.NET運行時在請求中查找驗證的cookie,這一次找到了,接下來做一些檢查(如失效日期、路徑等等),如果還沒有失效,那么讀取出它的值,恢復出用戶的信息,將Thread.CurrentPrincipal.Identity.Name的屬性值設置成恢復出的用戶名,檢查該用戶是否有權限去訪問當前請求的頁面,如果有,那么頁面執行的結果返回到用戶的瀏覽器。

  過程很簡單,對嗎?

  ASP.NET中多站點同域下的驗證原理

  如前所述,ASP.NET表單驗證完全依賴于cookie。那么只要使得不同的站點共享同樣的驗證cookie,那么就可以實現在一個站點登錄實現所有站點的登錄。

  HTTP協議指出,如果兩個站點是同域(或者是子域)的,那么可以共享cookie。本地的處理是瀏覽器根據網站的URL存儲cookie在本地(磁盤或者內存中)。當你請求接下來的任意頁面時,瀏覽器讀取和當前請求的URL匹配的域或子域的cookies,并將此cookies包含在當前的請求中。

  現在我們假設有下面兩個網站:

  www.mydomain.com/site1

  www.mydomain.com/site2

  這兩個站點共享同樣的主機地址(同樣的域mydomain.com和子域www),且兩個站點都被配置成了對用戶驗證和授權都使用表單驗證。假設你已經登錄過了站點www.mydomain.com/site1,如前所述,你的瀏覽器現在對于站點www.mydomain.com/site1已經有了表單驗證的cookie。

  現在你隨意訪問以www.mydomain.com/site1開頭的URL,表單驗證的cookie都將被包含在請求被發送。為什么?是因為此cookie本來就屬于該站點嗎?對的,但不是完全正確。事實上,是因為請求的URL:www.mydomain.com/site1http://www.mydomain.com/擁有同樣的域名和子域名。

  那么在你登錄了www.mydomain.com/site1后,如果你點擊www.mydomain.com/site2下的URL,表單驗證的cookie也將被包含在請求中發送,這同樣是因為www.mydomain.com/site2與站點http://www.mydomain.com/擁有同樣的域名和子域名,盡管它是不一樣的應用站點(site2)。顯然,在擁有一樣主機地址不一樣的應用站點名之間是可以共享表單驗證cookie的,這樣就實現了一處登錄處處都已經登錄的功能(也就是單點登錄)。

  然而,ASP.NET沒有允許你僅僅通過將同主機地址下的站點部署上表單驗證后就自動完成了單點登錄。為什么這樣呢?因為每一個不同的ASP.NET web應用程序使用它自己的密鑰去加密和加密cookie(還有諸如ViewState之類的)從而確保了安全。除非你給每一個站點指定了同樣的加密密鑰,那么cookies將被發送,但是另一個應用站點不能夠讀取驗證cookies的值。

  指定同樣的驗證密鑰可以解決這個問題。為每一個ASP.NET應用站點使用同樣的<machinekey>配置節即可,如下:

<machineKey 
  
validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D" 
  decryptionKey
="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
  validation
="SHA1"
  decryption
="AES"/>

操作流程:

 

  請求http://www.domain1.com/中一個需要驗證的頁面

狀態:瀏覽器沒有驗證cookie

NET技術跨域SSO的實現之一:架構設計,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美做真爱欧免费看 | 2012中文字幕在线动漫电影 | 亚洲国产精品无码中文字满 | 蜜桃视频一区二区 | 麻豆最新免费版 | 国产精品你懂得 | 在线观看永久免费网站 | 无码任你躁久久久久久老妇双奶 | 亚洲AV无码久久流水呻蜜桃久色 | 亚洲 日本 中文字幕 制服 | 亚洲国产在线2020最新 | 亚洲日本欧美国产在线视 | 鸥美一级黄色片 | 色婷婷国产精品视频一区二区 | 国产九九熟女在线视频 | JIZJIZJIZ 日本老师水多 | 欧洲xxxxx| 亚洲视频在线免费看 | 午夜福利在线观看6080 | 成熟YIN荡美妞A片视频麻豆 | 日韩精品专区在线影院重磅 | 麒麟色欧美影院在线播放 | 国产精品永久免费视频 | 在线 自拍 综合 亚洲 欧美 | 超碰视频在线 | 色欲AV亚洲永久无码精品麻豆 | 毛片亚洲毛片亚洲毛片 | 国产91青青成人a在线 | 日日色在线影院 | 麻豆AV无码蜜臀AV色哟 | 女人张开腿让男人添 | 亚洲a视频在线 | 另类专区hy777 | 久久99精品AV99果冻 | yellow日本动漫观看免费 | 国产精品久久久久久久伊一 | 日韩精品在线看 | 中文字幕乱码一区久久麻豆樱花 | 久久免费资源福利资源站 | 中文无码熟妇人妻AV在线 | 免费精品美女久久久久久久久久 |