在ASP.NET應用程式中捕捉身分識別驗證狀態的變化

來源:互聯網
上載者:User
asp.net|程式

  前年我寫過一篇隨筆抱怨Microsoft在ASP.NET架構中Session_End事件上處理,說來慚愧,其實當年我對ASP.NET運行時的複雜性理解不足。實話說,捕捉通過身分識別驗證和登出身分識別驗證對我來說,意義重大。例如:

  在登入前先檢查是否已經存在SSO提供器;

  登入完成後載入相關的許可權,這些載入過程可能與具體應用項目完全無關;

  登入結束後通知SSO提供器清除Cookie內容;

  ......

  目前的ASP.NET提供的解決方案是在Global.cs中加上FormsAuthentication_OnAuthenticated方法來捕捉已通過驗證事件。該方法的缺陷是:

  1.只能捕捉Forms身分識別驗證方式,而不能捕捉Windows和Passport認證方式;

  2.只能捕捉已通過身分識別驗證事件而不能捕捉身份登出事件;

  3.必須修改global.cs檔案。

  以上任何一個缺陷都是我無法接受的。當時在ASP.NET1.1解決那個問題時用了五六個介面,十多個類,並且有一個輸出類要求應用程式登入和登出時訪問相應的方法,而不是自由地使用FormsAuthentication的相關方法。現如今該問題總算比較滿意地解決了。思路是這樣的:

  在一個HttpModule中建立兩張會話表,一張記錄已通過身分識別驗證的會話;另一張記錄未通過身分識別驗證的會話,這樣,在HttpApplication.AcquireRequestState事件中尋找每個會話在這兩張表中的狀態:

  狀態一 兩張表中都沒有 這是一個新的會話

  狀態二 在已通過身分識別驗證的會話表中 已通過身分識別驗證

  狀態三 在未通過身分識別驗證的會話表中 未通過身分識別驗證

  如果是狀態一,則立即調用所有SSO提供器的身份查驗方法,只要有任何一個SSO提供器證實已經通過了身分識別驗證,則立即將狀態調整到狀態二,並通知所有訂閱身份狀態變化的Handler。如果是狀態二或狀態三,則立即與會話的實際身份狀態進行比對。會話實際的身份狀態可以通過查詢HttpContext.User來獲得。如果二者不同,則根據情況調整表中所記錄的狀態,並向訂閱身份變化的Handler發出相應的通知。

  有一個問題是:會話列表的查詢頻度非常高,每次Request都不可避免查詢一次。所以這裡對演算法的選擇要求較高。我在實際的項目中選擇了字串數組的BinarySearch演算法。這樣每次添加或刪除新的會話時不可避免對字串在數組中的位置進行調整,以保持排序狀態。當然,在比對過程中也需要根據命中率調整比對順序,例如三種狀態中,顯然狀態二的比例最高(當然數組往往也最龐大),應該優先選擇。

  最後的解決方案是:只用了三個介面,一個HttpModule和幾個內部類就實現了,完全不必修改global.cs,且沒有任何輸出類供登入認證模組調用,所有的SSO提供器也只需要通過web.config來配置,對業務層是完全透明的。這三個介面是:一個配置參數上下文介面、一個SSO提供器介面(同時兼做捕捉身份狀態變化的Handler介面)、一個Handler介面的工廠介面(以保持Handler介面的構造器自由以及決定是否建立Handler介面的實作類別執行個體)。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.