天天看點

Module Zero之使用者管理

使用者實體代表應用的一個使用者,它派生自AbpUser類,如下所示:

這個類是你在安裝module-zero時自動建立的。使用者資料存儲在資料庫中的AbpUsers表。你可以添加User類的自定義屬性(以及針對改變建立資料庫遷移)。

AbpUser類定義的基本屬性如下:

UserName:使用者的登入名,對于一個租戶來說應該是唯一的。

EmailAddress:使用者的郵箱位址。對于租戶來說應該是唯一的。

Password:使用者的哈希密碼。

IsActive:如果使用者可以登入到該應用,那麼此值為true。

Name和Surname:使用者的名和姓。

還有許多屬性,如Roles, Permissions, Tenant, Settings, IsEmailConfirmed等等。你可以在AbpUser類中檢視更多資訊。

AbpUser類派生自FullAuditedEntity。這意味着它有建立,修改和删除的審計屬性。它也支援軟删除。是以當我們删除一個使用者的時候,實際上它并沒有從資料庫中删除,而是僅僅标記為已删除的狀态。

為了在一個多租戶的應用中更好地工作,AbpUser類實作了IMayHaveTenant過濾器。

最後,User的Id定義為long類型。

使用者管理者是執行使用者領域邏輯的服務:

你可以注入使用者管理者,然後使用它來建立,删除,更新使用者,為使用者授權,改變角色以及更多。你可以在這裡添加你自己的方法。而且,你可以重寫AbpUserManager基類的任何方法來滿足你自己的需求。

如果你建立的不是一個多租戶應用,那麼你可以跳過本節。

曾經設計UserManager的目的是為單租戶服務的。預設是為目前租戶服務的。接下來看一下UserManager的一些用法:

UserManager的一些方法傳回了IdentityResult作為結果而不是抛出一些情況的異常。這是ASP.NET Identity Framework的本質。Module-zero也遵循這個。是以,我們可以檢視這個傳回的結果對象就可知道操作是否成功。

Module-zero定義了CheckErrors擴充方法,它可以自動地檢查錯誤,如果需要,也會抛出異常(本地化的UserFriendlyException)。樣例用法:

為了獲得一個本地化的異常,我們應該提供一個ILocalizationManager執行個體:

Module-zero的Login方法會認證資料庫的AbpUsers表中的使用者。一些應用可能要求認證來自外部資源的使用者(比如活動目錄,來自其他資料庫的表,甚至來自一個遠端服務)。

對于很多情況,UserManager定義了一個名叫“外部認證資源”的擴充點。我們可以建立一個派生自IExternalAuthenticationSource 的類,然後将它注冊到配置中。有一個簡化了IExternalAuthenticationSource的實作的類DefaultExternalAuthenticationSource ,來看一個例子:

在TryAuthenticateAsync方法中,我們可以檢查來自某些資源的使用者名和密碼,如果給定的使用者通過了該資源的認證,那麼傳回true。而且,我們可以重寫CreateUser和UpdateUser方法來控制該資源的使用者建立和更新。

當外部資源驗證通過一個使用者後,module-zero會檢查資料庫(AbpUser表)中是否存在該使用者。如果不存在,就會調用CreateUser來建立該使用者,否則調用UpdateUser使外部源更新已存在的使用者資訊。

在一個應用中,我們可以定義不止一個外部源。AbpUser實體有一個AuthenticationSource屬性,它表明了哪個源認證了該使用者。

為了注冊認證源,我們可以在子產品中的PreInitialize方法使用這些代碼:

LdapAuthenticationSource是一個外部認證的實作,它可以讓使用者使用他們的LDAP(活動目錄)使用者名和密碼登入。

最後,我們應該設定AbpZeroLdapModule的子產品依賴,然後開啟上面建立的LDAP認證源:

這些步驟之後,你的應用就開啟了LDAP子產品。但LDAP認證預設沒有開啟,我們可以使用設定來開啟它。

正如你在MyLdapAuthenticationSource的構造函數中看到的,LdapAuthenticationSource期望ILdapSettings作為構造函數參數。該接口用于獲得LDAP設定,如領域,使用者名和密碼,以連接配接到活動目錄。預設的實作(LdapSetting類)從設定管理者中獲得這些設定。

如果你使用了設定管理者,你可以使用設定管理者的API改變LDAP的設定。如果你想要的話,你可以通過将一個初始化/種子資料添加到資料庫來預設開啟LDAP認證。

注意:如果你沒有定義領域,使用者名和密碼,且你的應用運作在具有合适權限的領域中,那麼LDAP認證隻對目前的領域有效。

如果你想定義其他的設定源,那麼你可以實作一個自定義的ILdapSettings類,如下所示:

然後在子產品中的PreInitialize方法裡将它注冊到IOC中:

這樣,你就可以從其他資源獲得LDAP設定了。

本文轉自tkbSimplest部落格園部落格,原文連結:http://www.cnblogs.com/farb/p/moduleZeroUserManagement.html,如需轉載請自行聯系原作者