在 Android 上撰寫適用於 Microsoft Edge 的 SPNEGO 驗證器
第三方可以在適用於 Android 的 Microsoft Edge 中啟用 SPNEGO 驗證。 若要提供此驗證,他們必須提供SPNEGO驗證器。 本文說明 Edge 與 SPNEGO Authenticator 之間的介面。
簡介
SPNEGO 驗證器是由Android服務提供。 驗證器必須併入使用者裝置上安裝的第三方所提供的應用程式中。 應用程式負責管理用於SPNEGO驗證的任何帳戶,以及與SPNEGO伺服器的所有通訊。
SPNEGO Authenticator 是Android帳戶驗證器。 因此,它必須遵循 AbstractAccountAuthenticator 中所述的模式。 它必須實作衍生自 的 AbstractAccountAuthenticator
驗證器類別。
SPNEGO Authenticator 必須定義新的帳戶類型。 帳戶類型名稱應該衍生自寫入器的功能變數名稱 (例如 com.example.spnego) 。 帳戶類型必須定義為使用 customTokens ,且必須支援 “SPNEGO” 功能 (HttpNegotiateConstants.SPNEGO_FEATURE) 。
Microsoft Edge 的介面
Edge 會透過其提供的 Android 帳戶類型來尋找 SPNEGO 驗證器。 驗證器所定義的帳戶類型會透過 AuthAndroidNegotiateAccountType 原則傳遞至 Edge。
Edge 的介面是透過 Android 帳戶管理架構,特別是 透過 AbstractAccountManager.getAuthToken 。 在 org.chromium.net.HttpNegotiateConstants 中,Edge 會定義一些其他索引鍵和值,這些索引鍵和值會用於 getAuthToken
的自變數中,以及傳回的結果套件組合中。
getAuthToken 自變數
呼叫 getAuthToken 時, authTokenType
是 “SPNEGO:HOSTBASED:<spn”,其中 <spn>> 是要求的主體。 在目前的實作中,這一律是主機型主體。 未來的版本可能會允許其他類型的主體,但如果允許,則會使用不同的前置詞。 SPNEGO 驗證器應該檢查前置詞。
套 options
件組合包含下列金鑰:
- KEY_CALLER_PID
- KEY_CALLER_UID
-
HttpNegotiateConstants.KEY_CAN_DELEGATE
- 如果允許委派,則為 True,如果不允許則為 false。
如果這是多回合驗證序列的第二個或更新版本,它也會包含下列密鑰。
-
HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN
- 來自base64編碼 WWW-Authenticate 標頭的傳入令牌。 -
HttpNegotiateConstants.KEY_SPNEGO_CONTEXT
- 上一個回合驗證器所提供的SPNEGO內容。 Microsoft Edge 會將此套件組合視為不透明的物件,而且只會在四捨五入之間保留它。
getAuthToken 結果套件組合
getAuthToken 的最終結果組合 (傳回為 的getAuthToken
傳回值,或透過 AccountAuthenticatorResponse) 應包含 Android 檔中所定義的帳戶名稱、帳戶類型和令牌。 此外,套件組合應該包含下列金鑰:
-
HttpNegotiateConstants.KEY_SPNEGO_RESULT
- SPNEGO 結果碼。 這應該是 HttpNegotiateConstants 中定義的其中一個值。 -
HttpNegotiateConstants.KEY_SPNEGO_CONTEXT
- 要在下一個驗證回合中傳回給驗證器的內容。 只有在驗證不完整時,才需要這麼做。
實作建議
實作SPNEGO驗證器時,應考慮下列建議。
SPNEGO 帳戶驗證器所提供的每個帳戶都應該對應至單一密鑰發佈中心所提供的單一用戶主體 (帳戶) 。
帳戶驗證器不應該儲存任何密碼。 相反地,它應該儲存用戶主體的 TGT,並要求使用者在其 TGT 到期時,重新輸入其密碼 (或其他驗證數據) 。
帳戶驗證器應該保留每個帳戶的授權應用程式 (或應用程式簽章) 清單,並拒絕提供服務令牌給其他應用程式。 授權應用程式清單可以是:
- 內建在帳戶驗證器中。
- 可由系統管理員設定。
- 可由用戶設定。 在此情況下,帳戶驗證器可能會選擇允許使用者在第一次要求存取權時,動態授權新的應用程式。
驗證器可以使用選項套件組合的 [KEY_CALLER_UID] 欄位來取得呼叫應用程式的 uid,然後使用
context.getPackageManager().getNameForUid()
或類似的呼叫來識別要求的應用程式。這是必要的,以確保使用者執行的惡意應用程式無法使用使用者的認證,以非預期的方式存取服務。 這很重要,因為如先前所述,使用自定義令牌選項 () 在取得驗證令牌時停用Android自己的簽章檢查。
除非內建在帳戶驗證器中,否則系統管理員或用戶必須能夠設定密鑰發佈中心的位置。
顯示在 Microsoft Edge 中的錯誤碼
除了可從驗證器應用程式轉送的錯誤碼之外,嘗試驗證要求時也會顯示下列錯誤:
- ERR_MISSING_AUTH_CREDENTIALS:帳戶信息無法使用。 可能會因為下列任何原因而引發。
- 使用者未登入驗證器應用程式,且找不到符合資格的帳戶。
- 無法取得帳戶資訊,因為目前的應用程式沒有必要的許可權。
- 有一個以上的合格帳戶,我們無法從使用者取得選取專案。
- ERR_UNEXPECTED:發生非預期的錯誤,要求已終止。
- ERR_MISCONFIGURED_AUTH_ENVIRONMENT:無法完成驗證,因為應用程式設定發生一些問題。 部分許可權可能遺失。
使用 Logcat 在系統記錄檔中搜尋 cr_net_auth 標記,以取得這些錯誤原因的詳細資訊。
搭配使用驗證器與 Microsoft Edge
Edge 使用數 個原則來控制SPNEGO驗證的使用。 若要啟用SPNEGO驗證,必須設定 AuthServerAllowList , 且 AuthAndroidNegotiateAccountType 必須符合 SPNEGO 驗證器所提供的帳戶類型。
內容授權
注意
本頁的某些部分是根據 Chromium.org 創造和分享的作品加以修改,並根據創用 CC 姓名標示 4.0 國際版本授權條款中所述條款加以使用。 原始頁面可在此處找到。
本作品根據創用 CC 姓名標示 4.0 國際版本授權條款獲得授權。