天天看點

用戶端登入驗證 -- ESFramework 4.0 快速上手(15)

一. ESPlus.Application.Basic 空間的支援

      為了實作驗證使用者賬号密碼的功能,ESPlus.Application.Basic 命名空間增加了幾個基礎設施。

(1)ESPlus.Application.Basic.Passive.IBasicOutter 增加了Logon方法:

        /// <summary>

        /// 用戶端登陸驗證。

        /// </summary>

        /// <param name="systemToken">系統标志。</param>

        /// <param name="password">登陸密碼</param>      

        LogonResult Logon(string systemToken, string password);

      該方法向服務端送出目前登入使用者的賬号、密碼、系統标志等資訊,然後傳回服務端驗證後的登入結果。系統标志systemToken,用于表示目前用戶端來自哪個系統,服務端可以驗證這個标志是否與服務端比對,以判斷用戶端與服務端是否屬于同一套系統。在普通的應用中,我們可以忽略它。

      登入結果使用LogonResult 枚舉表示:

    public enum LogonResult

    {

        /// <summary>

        /// 登陸成功

        Succeed = 0,

        /// 賬号或密碼錯誤

        ErrorUserOrPassword,

        /// 已在其它地方登陸

        HadLoggedOn

    }

(2)ESPlus.Application.Basic.Server空間增加IBasicBusinessHandler接口

      當用戶端送出了目前登入使用者的賬号、密碼、系統标志等資訊到服務端後,服務端通過調用IBasicBusinessHandler來驗證帳戶資訊。

    public interface IBasicBusinessHandler

        /// </summary>        

        /// <param name="userID">登陸使用者賬号</param>

        /// <param name="systemToken">系統标志。用于驗證用戶端是否與服務端屬于同一系統。</param>

        /// <param name="password">登陸密碼</param>

        /// <returns>如果密碼和系統标志都正确則傳回true;否則傳回false。</returns>

        bool VerifyUser(string systemToken, string userID, string password);

      注意,我們在實作IBasicBusinessHandler時,并不需要判斷重登陸模式和使用者是否已經線上了,這些已經由架構幫我們做好了。是以,VerifyUser方法隻是傳回一個bool值,來表示帳号密碼是否正确。在實作該接口,并将其注入到ESPlus,就可以通過調用IBasicOutter的Logon方法來驗證使用者了。

      架構提供了null object模式的IBasicBusinessHandler實作EmptyBasicBusinessHandler,其在實作VerifyUser方法時,始終傳回true。

二.Rapid引擎内置登入驗證

      本次版本變更中,用戶端Rapid引擎和服務端Rapid引擎的Initialize方法都有所變化,以支援使用者登入驗證的機制。

(1)IRapidPassiveEngine 的Initialize方法: 

   LogonResult Initialize(string userID, string logonPassword, string serverIP, int serverPort, IBasicBusinessHandler basicHandler, ICustomizeInfoBusinessHandler customizeHandler);

      該方法新增加了登入密碼logonPassword參數,并傳回登入結果。

      在内部實作中,Initialize方法首先與伺服器建立TCP連接配接,然後通過IBasicOutter的Logon方法發送登入驗證請求并擷取登入結果,如果登入成功,則直接傳回;否則,關閉TCP連接配接,再傳回結果。要注意的是,如果與伺服器建立TCP連接配接失敗,Initialize會直接抛出對應的異常,而不是通過傳回值來表達。

      IBasicOutter的Logon方法所需的systemToken從哪裡來了?IRapidPassiveEngine 新增了一個可讀寫的屬性SystemToken,如果我們設定了它,Logon方法将會将其作為參數值傳入。 

      在使用者登入嘗試的過程中,程式可以反複調用Initialize來進行驗證,而不需要每次都new一個用戶端Rapid引擎執行個體。隻有Initialize方法傳回登入成功後,Rapid引擎的相關屬性才是可用的。比如,我們可以通過其新增的CurrentUserID屬性,來知道目前成功登入的使用者的UserID。

(2)IRapidServerEngine 的Initialize方法:

    void Initialize(int port, ICustomizeInfoBusinessHandler customizeInfoBusinessHandler, IBasicBusinessHandler basicBusinessHandler, IFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager);        

      服務端Rapid引擎的Initialize方法增加了IBasicBusinessHandler參數,正如前所述,服務端正是通過它來驗證用戶端送出的帳戶資訊的。如果我們不關心帳戶驗證,那麼可以傳入上面提到的EmptyBasicBusinessHandler執行個體,或直接傳入null -- 此時,引擎内部将預設使用EmptyBasicBusinessHandler來處理使用者的登陸驗證。

(3)對于大多數系統,登入時使用賬号密碼就已經足夠。有些特殊的系統,如果在登入時需要驗證更多的資訊(比如時間戳等),那麼大家可以巧用IRapidPassiveEngine的SystemToken屬性來傳遞這些額外的驗證資訊,因為SystemToken的值也會被送出給服務端的VerifyUser方法進行驗證。 

<a href="http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html">ESFramework 4.0 概述</a>

<a href="http://www.cnblogs.com/zhuweisky/archive/2011/03/24/1993417.html">ESFramework 4.0 有哪些優點?</a>

<a href="http://www.cnblogs.com/zhuweisky/archive/2011/04/15/2016760.html">ESFramework 4.0 版本更新說明(持續更新)</a>

<a href="http://www.cnblogs.com/zhuweisky/category/292821.html">《ESFramework 4.0 快速上手》系列所有文章</a>

繼續閱讀