ASP.NET Core 整合 WebAuthn/Passkey 無密碼登入之精簡範例
8 |
前幾個星期入手 YubiKey,花了點時間研究 WebAuthn / CTAP2 規格,從 .NET FIDO2 程式庫的 Passwordless 與 Usernameless 範例弄懂 WebAuthn 無密碼登入與 Passkey 的差異,最後我打算整理一個 ASP.NET Core 整合 Passkey 註冊與登入的精簡版範例專案,作為本次研究的結尾。
FIDO2 .NET Library 本身有提供範例專案,但是使用 Razor Page + MVC Controller,並同時包含 MFA、Passwordless、Passkey 等好幾種情境,我只打算針對 Passkey,使用 ASP.NET Miminal API、靜態 HTML/JavaScript 跟一個 Controller 處理必要的 WebAPI ,做為日後其他專案要整合 Passkey 登入的參考。
FIDO2 .NET Library 程式庫範例使用者資料及公鑰信物只存在記憶體,也沒有登入狀態,我做了一點小改良,資料改用 JSON 保存,以免程式結束實體金鑰裡的 Passkey 瞬間報廢,另外弄了個購物網站的登入狀態虛擬場景,方便觀察註冊、登入、登出的狀態差異。
專案原本只打算自己內用,不過既然花了時間整理,就放上 Github 讓有需要的同學多一份資料可參考。
My example project to integrate passkey login into ASP.NET Core web.
Comments
# by Sean
感謝黑大的分享 實際clone專案下來實際跑一次,但是是使用android手機當Authenticator 可以成功註冊與登入範例網站 但實際做完測試後,想要刪除手機上的passkey(參照您另一篇文章https://blog.darkthread.net/blog/webauthn-n-passkey-intro/ ) 卻發現無法找到localhost的密鑰可以刪除
# by Jeffrey
to Sean, 好奇,用手機當 Authenticator 進行測試,使用的網址應該不是 localhost 吧?
# by Sean
後來發現,由於我的android手機上有多個google帳戶 而註冊時,android手機上預設存放passkey的不是我慣用的google帳戶,提示字又很小一個,後來有找到刪除的位置 而黑大您的問題,用手機當 Authenticator 進行測試時,使用網址是localhost,可以正常運行 我也好奇的是,當掃描完qrcode後,選擇記憶設備,下次要進行登入時,手機就會自動跳出驗證畫面 (使用Firefox、Chrome進行網頁登入的時候),是如何達到通知手機啟用登入驗證的,難道是透過藍芽嗎? 註:使用Firefox雖然可以正常註冊,但通過手機指紋驗證後無法登入網站 由於只是了解一下passkey運作流程,就沒特意再找原因了
# by Jeffrey
to Sean, 啊,你喚醒我的記憶了... WebAuth 運作主要是透過網路傳輸,但使用藍牙確認手機在登入裝置附近,避免被遠端控制盜用金鑰。這篇有相關討論 https://blog.darkthread.net/blog/google-passkey/
# by Sean
黑大您好: 有先拜讀過[Google Passkey 筆記 - 使用手機免密碼登入 Google 帳號]這篇文章 就是因為提到了"WebAuth 運作主要是透過網路傳輸,但使用藍牙確認手機在登入裝置附近,避免被遠端控制盜用金鑰" 才產生了相關的疑問 而我測試的環境是,web server http://localhost:5229/, 使用同一台電腦的chrome開啟網站,且網路環境是內部網路(相關的port也無法對外),而android 手機是使用5G網路,所以兩者應該無法使用網際網路連線溝通 若藍芽只是用在確認手機再登入裝置附近,那當chrome記憶裝置後,再次登入時,chrome是如何通知android手機開啟驗證功能,而手機驗證通過後,又是如何通知網站 純粹好奇而已
# by Jeffrey
to Sean, 好問題! 意思是 localhost 那台無法連上 Internet 還是可以使用 Anroid Passkey?這樣我原先的認知就要修正了。 我想到一個確認方法,把手機的 5G 跟 WiFi 都停用,只開藍牙,若還能不能成功就代表 Passkey 認證是透過藍牙完成的。
# by Sean
黑大您好, 前篇留言沒說清楚,WebServer本身是可以連上Internet的,只是外部無法直接連線到這台主機 進行以下註冊流程測試 web server 關閉網路 / anodroid手機開啟行動網路 : 掃描QR Code完 手機顯示"裝置無法連線" web server 關閉網路 / anodroid手機開啟行動網路 : 掃描QR Code完 手機顯示"與裝置連線中,請稍後", 瀏覽器顯示"發生錯誤,儲存金鑰時發生問題" web server 開啟網路 / anodroid手機關閉行動網路 : 掃描QR Code完 手機顯示"裝置無法連線" 所以看起來的確還是透過網路傳送資料 另外想請問,有可能同一個UserID註冊多個Passkey嗎? 例如使用者可能會使用手機,平板,筆電瀏覽網站,windows 也有Windows hello功能 若每次進行登入時,都還要另外拿當初進行註冊的手機來進行登入驗證 而不能直接使用瀏覽網站時設備上的驗證功能,使用體驗就不太好
# by Sean
抱歉,自問自答 測試過可以同一個UserID註冊多個Passkey