【WorkNote】身分驗證管理工具抉擇

關於實現 Single Sign-On 單一登入機制

Jincoco
18 min readJan 12, 2023

由於公司目前有許多不同的業務需求,我們擁有非常多種系統包括B2B和B2C服務。然而,使用者必須在每個系統中獨立註冊帳戶,且系統間的資料並不共用,這使得行銷和分析消費者行為的效益有限。為了解決這個問題,整合會員資料庫和系統是必要的。一種解決方案是通過使用身份驗證工具實現單一登錄(SSO)機制。然而身份驗證工具有許多不同的選項,要選出最適合公司需求的工具較為困難。因此,我們將開始進行不同SSO工具的比較報告,評估它們的功能,做出明智的決策。

在持續更新這篇文章一陣子後,也到網路上詢問其他大神的意見,問題內包含了描述公司目前的需求與狀態,可以先到裡面看看。

— — — — — — — — 正文開始 — — — — — — —

自行架設 Host 類型服務

Duende IdentityServer

https://duendesoftware.com/products/identityserver

由於公司的系統架構除了使用 PHP,其他大多是使用 ASP.NET 來建置,故首先就先嘗試了基於 ASP.NET Core 的 Duende IdentityServer 套件。

Duende IdentityServer 是基於在 ASP.NET Core 框架上的身分認證套件,但不限於對象是特定平台或語言體系,只需將套件加入 ASP.NET Core 專案下即能實現一種身分驗證伺服器,內建支援第三方身分驗證服務 (Google、Facebook) 透過高度整合優化 OpenID Connect、OAuth2 協議,輕鬆為多個應用實現單點登錄 (SSO),支援不同類型資料庫來儲存用戶、客戶端、Token憑證。

簡介

Duende IdentityServer 不是免費的,需要購買授權 (但目前實作似乎沒有區別),除了官方提供的練習用範例 UI 介面,基本上它就像一組 API,優點是能夠高度自定義(幾乎是從頭開發),無論是功能或是操作介面,但也意味著建置工作量較大,它並不是一種獨立應用而是中間套件,必須搭配 ASP.NET Core 專案再一同部屬,靈活性較高但也相對困難。

可以任意與 Asp.Net Core 應用搭配,理論上可以全部寫一起

付費方案

IdentityServer 方案費用 & 額外的擴充插件,需付費購買

關於 IdentityServer 的歷史

Duende IdentityServer 是由 IdentityServer4 演變而來,最早能追溯到 2015 年或更早,經過多年開源優化與迭代更新,現今由 Duende Software 公司進行營利維護,IdentityServer4 (.NET Core 3.1) 已於 2022 年 12 月 13 日 停止更新 (資料來源 : https://leastprivilege.com/2020/10/01/the-future-of-identityserver/),目前官網範例使用 .NET Core 6,在網路上以高安全性而聞名,完全符合協議標準,並獲得 OpenID 基金會的正式認證。

IdentityServer4 仍是一個免費開源軟體,儘管官方停止支援,後續將由社群自主維護,對於初創公司還是很好的選擇。

2023.1 / fork 200 / star 890

✅高靈活性 ✅高安全性 ✅架構模板⚠️授權費用⚠️中高難度

Key Reference

如何评价IdentityServer4不再更新新功能?
Cloud Native Apps 的 IdentityServer (IS4預設為.Net身分套件)
Duende Software Documentation (官方說明)
Best Alternatives to IdentityServer4 (選用替代方案)

當IdentityServer不再免費?

Openiddict

https://documentation.openiddict.com/guides/index.html

OpenIddict 是一個開源的通用框架,同時用於 Asp.Net Core/Framework 應用中建構符合標準的 OAuth 2.0/OpenID Connect 中間服務器。

透過蒐集網路文獻,可以發現 IdentityServer 自從開始收費後,非常不受社群歡迎,社群紛紛尋找其他替代方案,而 Openiddict 同樣是基於 ASP.NET 的架構來實現,並且同時支援 Core/Framework,與 IdentityServer 相同專注於客戶端身份驗證與 Token 管理,但少了內建用戶身分驗證的功能必須自己實作 (不過可以搭配 Asp.Net Core identity)

更高的自由度,代表著 Openiddict 更少開箱即用的功能,封裝程度與文件指引不如 IdentityServer 完善,需要額外撰寫程式代碼,在開發上需要更多時間。

關於 Openiddict 的歷史

OpenIddict 於 2015 年底誕生,最初是建立在 AspNet.Security.OpenIdConnect.Server (代碼名稱 ASOS) 上作為一個低階的 OpenID Connect 中間件。2020 年合併到了 OpenIddict 3.0 中,之後Microsoft.Owin 增加了對 OpenIddict 3.0 的支援,使它能在 ASP.NET 4.6.1 可以用來取代 OAuthAuthorizationServerMiddleware 以及OAuthBearerAuthenticationMiddleware的功能,而不需要將專案遷移到 ASP.NET Core 架構下,這也是為何同時支援 Core/Framework 架構。

簡單來說,OpenIddict 是基於AspNet.Security.OpenIdConnect.Server 構建的,簡化了設置認證的流程。

Key Reference

What’s OpenIddict? (官方說明)
Introducing the OpenIddict client (作者的話)
OIDC — OpenIddict Core (與IS代碼差距)

✅最高靈活性 ✅完全免費 ✅第三方解決方案 ⚠️安全性考驗能力 ⚠️高難度

Keycloak

https://www.keycloak.org/

Keycloak 是一種基於 Java 的開源身份管理系統,提供單點登入(SSO)功能,支援多種認證協定,如 OpenID Connect、OAuth 2.0、SAML 2.0,並提供一個易於使用的圖形化管理控制台,可以與第三方提供商整合如 Facebook, Google, Github…,更是一個開箱即用的產品,透過 Docker 版本可以在幾分鐘內啟動它。

由於 Keycloak 是一種產品,它缺乏前述套件具有的靈活性。雖然有一些可用的擴充 (使用 Java 和 Javascript),但並不是所有的東西都可以完全定制。例如,不支持用戶的自定義授權類型和自定義登錄流程。

搭配 Docker 5 分鐘完成環境建置

透過 Docker 在5分鐘內建置好環境

Key Reference

什麼是Keycloak — iT 邦幫忙
What Keycloak Is and What It Does?
Free Arch: Keycloak vs Authing (大佬評測)
用Keycloak學習身份驗證與授權

✅完全免費 ✅成熟產品 ✅開箱即用 ✅輕量化✅Red Hat 背景支持 ⚠️高速迭代

ASOS , Openiddict , IdentityServer , Keycloak

以在 Asp.Net 架構下常提到的為例,IdentityServer & Openiddict 這兩個框架都非常嚴格地遵循標準,在實現 OAuth2.0 與 OpenIdConnect 時,不需要處理太多瑣碎的代碼,並且保持一定的靈活性,依裝的程度也影響到它們之間的易用性差異,首先 :

AAspNet.Security.OpenIdConnect.Server (ASOS) 提供了最原始的 OAuth2/OpenID Connect 協議,需要非常熟悉協議內容,適合需要高度客製化協議流程的情形,但其結果未必能符合協議安全性。

OOpeniddict 則將 ASOS 進行整合並進行進一步的封裝調整,提供了一個快速實現更安全的 OIDC 協議的框架,屬於開放式代碼,而 ASOS 已被 Openiddict 合併,實務上直接使用 Openiddict。

IIdentityServer 在經由公司維護後,擁有比 Openiddict 更成熟的封裝優化更高且經認證的協議實現,提供數種快速建置模板,相對於其他兩者更為完善,開箱即用同時擁有靈活性,也是唯一需要購買授權的套件。

KKeycloak 則是產品的形式將功能包裝好,所以幾乎沒有可以自訂流程的地方,但這並不影響安全性,體感上是非常成熟的軟體,其背後技術團隊是有名氣的公司,以及非常高的社群活動量與更新迭代。

成熟度 : Keycloak > IdentityServer > Openiddict
安全性 : IdentityServer >= Keycloak > Openiddict
易用性 : Keycloak > IdentityServer > Openiddict
自由度 : Openiddict >= IdentityServers > Keycloak

Key Reference

IdentityServer4 vs AspNet.Security.OpenIdConnect.Server vs OpenIddic (Asp.Net OIDC 套件之比較)

自行架設 Host 類型服務小結

在建立和嘗試 Keycloak 環境並比較身份驗證工具後,發現免費開源的 KeyCloak 更易於使用。Duende IdentityServer 集成於 Asp.Net 環境,提供了很大的靈活性和定製能力。儘管官方支援已經停止,使用免費的 IdentityServer4 也不是壞事。Openiddict 更復雜,更適合一整個團隊一起研究,其組件也更分散,但有更多第三方解決方案。

Keycloak 和另外兩個解決方案之間的差別在於它是一個獨立的產品而不是一個庫。這意味著它可以“獨立運行”。如果您有一個應用程序生態系統(可能使用不同的技術構建)並且不想讓其中一種架構成為執行所有用戶管理的核心,那正好適合 Keycloak,具有完全成熟的管理用戶界面和對多租戶的支持 — Xavier Hahn

雲端 SaaS 類型服務

FireBase

Firebase是Google提供的一個後端雲端服務平台,主要提供應用程式開發者開發應用所需的基礎架構。Firebase可以快速建立具備即時性、擴展性和易於維護的應用程式,而無需擔心基礎架構的問題。

Firebase也提供了單一登入(Single Sign-On, SSO)功能。Firebase Authentication可以讓開發者輕鬆地為其應用程式實現用戶身份驗證和管理。Firebase Authentication支持多種身份驗證方式,例如:電子郵件和密碼、Google、Facebook、Twitter和GitHub等。

透過 Firebase Authentication 可以提供一個簡單而安全的解決方案,可以快速實現應用程式的身份驗證和管理。

Firebase 的服務範圍很廣,從後端資料庫、身份驗證、雲端存儲、推播通知、分析等等,不過如果專案需要高度客製化或較複雜的資料處理,Firebase 可能不太適合,因為 Firebase 的設計初衷是為了簡化應用程式開發者的工作,提供一個快速的開發解決方案,因此相對有些限制,比較適合個人或小團隊的獨立開發項目。

不過也有轉移6百萬用戶的案例,因為Auth0實在太貴XD。

Okta & Auth0

作為在 Reddit 網路聲望也頗高的 Auth0,其安全性與易用性也備受讚賞,是個優秀的身份認證 SaaS 平台,其提供每月 7000 人的免費流量,隨後就必須付費使用,在本專案就排到後半部研究,其中也包含 Azure、Google 這類的身分驗證服務平台。在不考慮成本的情況下,Auth0 有著優秀成熟的身份認證和授權功能,支持多種身份驗證方式,包括社交媒體登錄、多因素身份驗證等等。另外,Auth0 還提供了豐富的開發人員文檔、SDK和API,方便開發人員快速集成身份驗證和授權功能到自己的應用程序中。(體感使用起來像是更易用的 Keycloak。)

除了 Auth0,Okta 也是一個值得考慮的身份認證 SaaS 平台,而兩者的關係並非一般。Okta 收購了Auth0以鞏固其作為產業龍頭的地位,並持續為客戶提供 IAM 的解決方案,且Okta公司股票在納斯達克上市。

Auth0和Okta都是廣泛使用的身份驗證和授權服務,它們之間的差異在以下幾個方面:

  1. 定位和目標市場:Auth0和Okta的定位和目標市場有所不同。Auth0主要針對開發人員和技術團隊,旨在為開發人員提供可靠的身份驗證和授權解決方案。相比之下,Okta更關注企業級身份管理,針對更大型、複雜的企業部署提供完整的身份管理解決方案。
  2. 功能和特性:Auth0和Okta提供的功能和特性有所不同。例如,Okta提供更多的企業級功能,如單點登錄、多因素身份驗證、移動裝置管理等,而Auth0提供更多的開發人員工具和API,如自定義驗證管道、多租戶支持、身份提供者集成等。
  3. 安全和合規性:Auth0和Okta都強調安全和合規性,但它們的安全和合規性重點有所不同。例如,Okta提供更多的合規性和監管標準支持,如HIPAA、SOC 2、FedRAMP等,而Auth0則強調其現代化的安全性和保護隱私的方法。

總的來說,Auth0 似乎更側重於後端集成(客戶登入),而 Okta 更側重於大型企業和複雜的身份管理的前端集成(員工+客戶登入),兩者都是優秀的身份驗證和授權解決方案,適用於不同的場景和需求。

Azure Active Directory B2C

由於公司內部已採用了 Active Directory 對內部做權限管理,故對於採用 Azure Active Directory 自然也在考慮範圍內。首先必須搞清楚這些令人混淆的服務名稱。

Active Directory(AD)

是一種由微軟開發的身份驗證和授權服務,是企業級身份驗證解決方案,用於管理組織內的使用者帳戶、計算機和其他資源。它的主要目的是將所有帳戶和資源集中在一個地方,以簡化管理和加強安全性。所以在我們公司內,員工的帳號都需要經過資訊部處理後,其他權限才能被開通,例如email。

Azure Active Directory(Azure AD)

是一種在雲端中提供的身份驗證和授權服務,與傳統的Active Directory不同,它是建立在Azure雲端平台之上。Azure AD支援與多種雲端應用程式和服務的整合,例如Office 365、Salesforce、Dropbox等等,用戶可以使用相同的帳號和密碼登錄這些應用程式和服務。

簡單來說,Active Directory 適用於管理內部的網絡環境,而Azure AD則適用於管理雲端應用程式和服務,並且支援跨組織和跨地域的身份驗證和授權。那 Azure Active Directory B2C 又是什麼呢?

Azure Active Directory B2C ( Azure AD B2C )

是一種基於Azure AD的身份驗證解決方案,主要用於企業和組織提供對外身份驗證服務,透過Azure AD B2C,企業可以提供一個統一的登錄介面,實現單點登入的效果 (SSO),讓消費者可以使用社交媒體、電子郵件、簡訊等方式進行註冊和登錄,同時也支援多種認證方式,例如密碼、多重因素認證等等,以提高安全性。

但是網路上的評價非常的差,使用起來像是半成品,還有複雜的設置過程。

Reference

https://www.reddit.com/r/dotnet/comments/rka444/what_identity_authority_platform_do_you_use/
https://www.reddit.com/r/dotnet/comments/v9ehtb/which_authentication_solution/
https://www.reddit.com/r/node/comments/pujt3i/which_identity_provider_should_i_use/

雲端 SaaS 類型服務小結

後面比較了這幾項 SaaS 服務,都擁有不錯的管理介面,在建置時程也會比自架 Host 快上許多,但需要對成本的考量、敏感資訊的保存問題,排除掉了價格較高的 Okta & Auth0 雖然他們確實非常優秀,聲望是大於 AzureB2C 的,但風評一致認為是優秀易用但是價格不菲,而 AzureB2C 在實作上令人詬病,Firebase 受到個人小型專案歡迎,另外公司內部已經使用了微軟的服務,故不考慮 AWS 與 GCP 的身分管理服務。

額外內容 — Authentik

Authentik 是一個開源的身份驗證和授權平台,由 Python 撰寫,支持多種身份驗證協議,包括 SAML、OpenID Connect、LDAP 等,可以實現單點登錄 (SSO) 和多因素身份驗證 (MFA) 功能。它具有豐富的功能,例如自動化註冊和注銷用戶、用戶自助服務等等,同時支持多種數據庫系統。Authentik 提供了一個易於使用的 Web 界面,可以幫助企業實現高效、安全的身份驗證和授權管理。

這個年輕的專案,受到了大量社群的推崇,其豐富的功能可以說是五臟俱全,由於 Authentik 是一個新的專案,因此文案方面不那麼成熟,有些問題可能會難以得到解答。但是,由於它是開源的,因此開發人員可以根據自己的需要自由地修改和擴展它。此外,Authentik 獲得了許多社群的推崇,它的功能強大、易於使用,是一個非常有成長潛力的身份驗證和授權平台。

我們的選擇

我們放棄了已經停止支援的 IdentityServer4、需要大量人力維護的 Openiddict以及來自中國的 Authing。Duende IdentityServer則仍在考慮之內。最近的一次會議結論是,為了快速整合和容易維護,同時需要在付費服務和人力成本之間取得平衡。因此,我們開始研究 SaaS 的身分驗證服務,可能會排除掉成本較高的 Auth0、Okta,小型專案使用的 Firebase。因為內部已經使用微軟服務,故也排除了 AWS 與 GCP 的服務。

目前剩下 Duende IdentityServer、Keycloak、AzureAD B2C、Auth0,以下是透過 ChatGPT 得出的標準(參考)答案。

  1. 如果公司對安全性要求非常高,且擁有足夠的人力來維護,那麼可以考慮使用 Duende IdentityServer。
  2. 如果公司預算較少,但對於開源工具有信心,可以考慮使用 Keycloak。
  3. 如果公司希望短期內快速上線,並且願意支付高額費用,可以考慮使用 Auth0。
  4. 如果公司已經在使用微軟的其他服務,並且想要整合身份驗證,可以考慮使用 AzureAD B2C。

--

--