有時候除了系統本身帳密(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
啓用 LDAPDefaultSettingsCreator
設定 LDAP 相關參數,AD 的 Domain,帳號,密碼這裏要注意一下,密碼的部分是不可以使用明碼的,因爲 ABP 預設取密碼時會先解密,所以放明碼的話,一定會發生連不到 AD 的問題。(加密可以使用 SimpleStringCipher.Instance.Encrypt)
PS. 如果 AD 跟 AP 是同 Domain 的情況下,AP 透過適當的權限設定是可以不用做這一段設定的。
這樣就大功告成了!!!
接着來看一下 ABP 的登入流程
透過這個流程圖可以知道,ABP 預設會先走外部登入(如果有實作並註冊),如果外部登入都失敗,才會走內部登入。
最後來看一下 AbpUsers table,其中有一個 AuthenticationSource 欄位,就是記錄這個 User 是從那個登入驗證進來的。