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

來源:互聯網
上載者:User

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

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

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

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

圖是Forms身分識別驗證的資料流程圖(MSDN中的)

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

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

先建立一個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對應部分

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

testLogon2的Web.config對應部分

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

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

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

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

<configuration>
    <system.web>
        <authentication>
            <forms name=".ASPXAUTH" 
                   loginUrl="logon.aspx"     
                   protection="all"  <!-- Protection must be identical.-->
                   timeout="30" 
                   path="/" >   <!-- Path must have a compatible scope.-->
        </authentication>

        <!-- Validation and decryption keys must exactly match and cannot
             be set to "AutoGenerate". The validation algorithm must also 
             be the same. -->
        <machineKey>
            validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
            decryptionKey= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
            validation="SHA1"
            isolateApplications="false"
        </machineKey>
    </system.web>
</configuration>

 

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

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

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

函數是

protected void Application_AuthenticateRequest(Object sender, EventArgs e)

6.研究一下ASPdotNetForum2.0代碼發現,Global.asax不見了,而在它的設定檔中多了一項

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

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

 private void Application_AuthenticateRequest(Object source, EventArgs e) 

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

例子代碼下載
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.