選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
3 分鐘閱讀時間 (520 個字)

AspNetBoilerplate(ABP) - 外部登入

Abplogo

有時候除了系統本身帳密(AbpUsers table)登入功能之外,還需要有外部的登入功能,例如 LDAP 或是 Social Login,這時候 ABP 提供了一個名爲 DefaultExternalAuthenticationSource 的抽象類別,此類別提供了幾個方法如下:

  • TryAuthenticateAsync
    • 此方法中會拿到 user 輸入的帳號與密碼,並使用這組帳密來完成外部登入的驗證。
  • CreateUserAsync
    • TryAuthenticateAsync 驗證成功後,如果該帳號不存在於 AbpUsers table 之中,則會呼叫此方法來建立一個 User 物件。
  • UpdateUserAsync
    • TryAuthenticateAsync 驗證成功後,如果該帳號存在於 AbpUsers table 之中,則會呼叫此方法來更新 User 物件。

透過實作 DefaultExternalAuthenticationSource 抽象類別,並且註冊到 module 之中,即完成了外部登入的實作。

接下來就以實作 LDAP 爲例,而 ABP 有針對 LDAP 以 DefaultExternalAuthenticationSource 爲底,提供了名爲 LdapAuthenticationSource 的抽象類別,所以如果是要實作 LDAP 的話,建議是直接使用 LdapAuthenticationSource (需要從 NuGet 安裝 Abp.Zero.Ldap),因為此類別已經先實作好上述提到的 3 個主要方法。

  1. 首先到 NuGet 安裝 Abp.Zero.Ldap 套件到 Core(Domain) project
  2. 實作 LdapAuthenticationSource 抽象類別

LdapAuthenticationSource 有一個比較特別的方法爲 UpdateUserFromPrincipal,這個方法在 CreateUserAsync 以及 UpdateUserAsync 都會被呼叫,主要是爲了從參數 userPrincipal 中,拿到 AD 上的資料來將 User 物件資料做更新。

  1. module 啓用 LDAP

  1. DefaultSettingsCreator 設定 LDAP 相關參數,AD 的 Domain,帳號,密碼

這裏要注意一下,密碼的部分是不可以使用明碼的,因爲 ABP 預設取密碼時會先解密,所以放明碼的話,一定會發生連不到 AD 的問題。(加密可以使用 SimpleStringCipher.Instance.Encrypt)

PS. 如果 AD 跟 AP 是同 Domain 的情況下,AP 透過適當的權限設定是可以不用做這一段設定的。

這樣就大功告成了!!!

接着來看一下 ABP 的登入流程

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

最後來看一下 AbpUsers table,其中有一個 AuthenticationSource 欄位,就是記錄這個 User 是從那個登入驗證進來的。

如何在 .net上實作具有 plugin 機制的系統
Ansible # 16 - Playbook [3]

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/17, 週五

Captcha 圖像