有時候除了系統本身帳密(AbpUsers table)登入功能之外,還需要有外部的登入功能,例如 LDAP 或是 Social Login,這時候 ABP 提供了一個名爲 DefaultExternalAuthenticationSource 的抽象類別,此類別提供了幾個方法如下:
TryAuthenticateAsync 驗證成功後,如果該帳號不存在於 AbpUsers table 之中,則會呼叫此方法來建立一個 User 物件。TryAuthenticateAsync 驗證成功後,如果該帳號存在於 AbpUsers table 之中,則會呼叫此方法來更新 User 物件。透過實作 DefaultExternalAuthenticationSource 抽象類別,並且註冊到 module 之中,即完成了外部登入的實作。
接下來就以實作 LDAP 爲例,而 ABP 有針對 LDAP 以 DefaultExternalAuthenticationSource 爲底,提供了名爲 LdapAuthenticationSource 的抽象類別,所以如果是要實作 LDAP 的話,建議是直接使用 LdapAuthenticationSource (需要從 NuGet 安裝 Abp.Zero.Ldap),因為此類別已經先實作好上述提到的 3 個主要方法。
LdapAuthenticationSource 抽象類別
LdapAuthenticationSource 有一個比較特別的方法爲 UpdateUserFromPrincipal,這個方法在 CreateUserAsync 以及 UpdateUserAsync 都會被呼叫,主要是爲了從參數 userPrincipal 中,拿到 AD 上的資料來將 User 物件資料做更新。
module 啓用 LDAP
DefaultSettingsCreator 設定 LDAP 相關參數,AD 的 Domain,帳號,密碼
這裏要注意一下,密碼的部分是不可以使用明碼的,因爲 ABP 預設取密碼時會先解密,所以放明碼的話,一定會發生連不到 AD 的問題。(加密可以使用 SimpleStringCipher.Instance.Encrypt)
PS. 如果 AD 跟 AP 是同 Domain 的情況下,AP 透過適當的權限設定是可以不用做這一段設定的。
這樣就大功告成了!!!
接着來看一下 ABP 的登入流程

透過這個流程圖可以知道,ABP 預設會先走外部登入(如果有實作並註冊),如果外部登入都失敗,才會走內部登入。

最後來看一下 AbpUsers table,其中有一個 AuthenticationSource 欄位,就是記錄這個 User 是從那個登入驗證進來的。
When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.
評論