ASP.NET跨應用程式進行登入的解決

weixin_33858249發表於2017-11-16

最近一個朋友問我一個問題:

       如何可以將ASPdotNET Forum2.0放到他的一個專案中(好象網上也有人討論過如何將dotText和ASPdotNET Forum等開源專案整合起來的),他原來的專案已經有一套使用者登入機制了,而且使用者資料庫也是現成的,如何使得在他原來系統上登入後就可以直接轉到Forum上,而又不需要再次輸入使用者資訊呢?剛開始感覺a piece of cakecake.gif...象這種一次登入,然後可以訪問多個應用其實在很久就已經提出來了,在幾年前還幫公司做過一個類似的產品原型,但那個是針對異構網站的,說白了就是做一個代理,只是內部有套機制將後面的幾個異構網站的使用者資料庫對映起來而已。這種方式看起來似乎可以解決問題,但資料庫之間的對映關係處理起來很麻煩,如果下面應用多了的話,工作量是很大的。

        對於這種技術,似乎有個名詞叫Single Sign On,有點象網易的通行證了。如果內部網站是同一批人做的倒問題不大,只要協調好了這個通行證的格式和一些相關的問題就可以了。而朋友的情況似乎也沒有那麼複雜,他原來的專案也是用.NET平臺技術的。.NET平臺下是否有比較好的整合解決方案呢?72_72.gif


這自然涉及到了.NET平臺下驗證的相關問題了。ASP.NET自身已經支援三種驗證方式(不包括None):
1. Windows身份驗證,新建立一個Web應用,似乎預設就是用這樣的方式的。顯然這個不是需要的。
2. Passprot身份驗證,需要Microsoft支援,它其實提供了一個WebServices來幫助你統一完成驗證工作,使   用這個在內部 網專案中似乎沒有太大必要。
3. Forms身份驗證,通過Cookie來傳遞身份驗證資訊,看起來類似通行證之類的,應該是要找的東西了。

圖是Forms身份驗證的資料流程圖(MSDN中的)

Forms.JPG

       上圖十分清晰的描述了Forms身份驗證的基本原理,但是對於多個應用呢?仔細查MSDN(MSDN真的好多資料啊,經常看過了再想翻回去已經忘記在那裡找出來的了 cry_smile.gif  BTW:有沒有MSDN書籤功能的?),發現相關的描述很多,但只有一個“跨應用程式進行Forms 身份驗證”比較具體,而內容就簡單些了。

看來還是需要自己先動手做個簡單的測試來邊試邊查資料了shades_smile.gifshades_smile.gifshades_smile.gif...



先建立一個testLogon的Web應用
主要檔案包括:
default.aspx (通過驗證跳入的頁面)
test1.apsx   (登入的頁面)
Global.asax  
Web.config   (配置檔案)

再建立另外一個testLogon2的Web應用
主要檔案:
default.aspx (通過驗證跳入的頁面)
Global.asax
Web.config    (配置檔案)



測試最終達到的效果:
兩個Web應用的default都是受保護的,沒有通過驗證是不可以進入的,即使在輸入訪問地址URL,會自動跳轉到testLogon\test1.aspx要求登入,當登入通過後,則可以任意在兩個應用的default.aspx跳轉。
testLogon\default.aspx中有Logout的功能,Logout後則需要重新登入了。

要達到這個效果,基本設定需要:
1.將IIS配置為允許匿名訪問,保證可以通過IIS來控制傳遞請求給ASP.NET;
2.如果必要傳輸過程配置為SSL,這裡沒有這個必要了;
3.對應的兩個應用的配置檔案必須設成一致;

以上這些基本設定在MSDN中都可以找到相關的描述,但是實驗這個效果到成功卻花費了比預計長的時間,因此覺得十分有必要將其記錄下來,對自己對他人都有好處。

得到的經驗教訓如下:
1.配置檔案Web.config中,將驗證模式設為Forms,而且在下面的引數中,要保證兩邊一致
testLogon的Web.config對應部分

None.gif    <authentication mode="Forms">
None.gif    <forms name=".AspNetForums" protection="Encryption" timeout="60" loginUrl="test1.aspx" />
None.gif    </authentication>
None.gif

testLogon2的Web.config對應部分

None.gif    <authentication mode="Forms">
None.gif       <forms name=".AspNetForums" protection="Encryption" timeout="60" loginUrl="\testLogon\test1.aspx" />
None.gif    </authentication>
None.gif


2.<machineKey>的增加是必須的
為保證兩邊兩邊應用對cookie的處理和讀取一致,這個屬性是必須的,且要相同

None.gif     <machineKey
None.gif         
validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
None.gif         decryptionKey
= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
None.gif         validation
="SHA1"> 
None.gif     </machineKey>
None.gif



3.MSDN雖然要查,但不可以完全依靠,特別是程式碼
在MSDN中,關於machineKey的程式碼如下:

None.gif<configuration>
None.gif    <system.web>
None.gif        <authentication>
None.gif            <forms name=".ASPXAUTH" 
None.gif                   loginUrl
="logon.aspx"     
None.gif                   protection
="all"  <!-- Protection must be identical.-->
None.gif                   timeout="30" 
None.gif                   path="/" >   <!-- Path must have a compatible scope.-->
None.gif        </authentication>
None.gif
None.gif        <!-- Validation and decryption keys must exactly match and cannot
None.gif             be set to "AutoGenerate". The validation algorithm must also 
None.gif             be the same. 
-->
None.gif        <machineKey>
None.gif            validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
None.gif            decryptionKey= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
None.gif            validation="SHA1"
None.gif            isolateApplications="false"
None.gif        </machineKey>
None.gif    </system.web>
None.gif</configuration>
None.gif

 

但顯然有著錯誤的,大家編譯一下就知道了,格式錯了,而且isolateApplication也不是這樣用的

4.為保證兩邊讀到的cookie一致,不要用isolateApplication,它使得各自用自己的cookie了。

5.關於Global.asax的注意,對於Web.config中authentication的節點會觸發Global.asax中的事件的,對應

函式是

None.gifprotected void Application_AuthenticateRequest(Object sender, EventArgs e)
None.gif


6.研究一下ASPdotNetForum2.0程式碼發現,Global.asax不見了,而在它的配置檔案中多了一項

None.gif        <httpModules>
None.gif            <add name="AspNetForums" type="AspNetForums.ForumsHttpModule, AspNetForums.Components" />
None.gif        </httpModules>
None.gif


是的,看一下ForumsHttpModule的原始碼,結構和Global.asax基本一樣,一樣有個事件觸發函式

None.gif private void Application_AuthenticateRequest(Object source, EventArgs e) 
None.gif



       下面不用我多說了吧?具體該如何做到和dotNetForum一起達到SSO的目標的答案已經出來了 tongue_smile.gif


本文轉自風前絮~~部落格園部落格,原文連結:http://www.cnblogs.com/windsails/archive/2004/10/15/52818.html,如需轉載請自行聯絡原作者

相關文章