共用方式為


使用 Azure AD B2C 在 iOS Swift 應用程式中啟用驗證選項

這很重要

自 2025 年 5 月 1 日起,Azure AD B2C 將不再可供新客戶購買。 在我們的常見問題中深入瞭解

本文說明您可以為您的 iOS Swift 應用程式啟用、自定義及增強 Azure Active Directory B2C (Azure AD B2C) 驗證體驗的方式。

開始之前,請先熟悉下列文章:

使用自訂網域

藉由使用 自定義網域,您可以完全將驗證 URL 品牌化。 從使用者的角度來看,使用者在驗證過程中會停留在您的網域上,而不會被重新導向至 Azure AD B2C b2clogin.com 網域名稱。

若要完全移除 URL 中對「b2c」的所有提及,您也可以將驗證請求 URL 中的 B2C 租使用者名稱 contoso.onmicrosoft.com 取代為您的租使用者 ID GUID。 例如,您可以變更 https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ 變更為 https://account.contosobank.co.uk/<tenant ID GUID>/

若要在驗證 URL 中使用自訂網域和租使用者識別碼,請執行下列動作:

  1. 遵循 啟用自定義網域中的指引。
  2. 使用 kAuthorityHostName 您的自定義網域更新類別成員。
  3. 請用您的 kTenantName更新 類別成員。

下列 Swift 程式代碼會在變更之前顯示應用程式設定:

let kTenantName = "contoso.onmicrosoft.com" 
let kAuthorityHostName = "contoso.b2clogin.com" 

下列 Swift 程式代碼會顯示變更之後的應用程式設定:

let kTenantName = "00000000-0000-0000-0000-000000000000" 
let kAuthorityHostName = "login.contoso.com" 

預先填入登入名稱

在登入使用者旅程圖期間,您的應用程式可能會以特定用戶為目標。 當應用程式以用戶為目標時,可以在授權要求 login_hint 中指定具有使用者登入名稱的查詢參數。 Azure AD B2C 會自動填入登入名稱,而且使用者只需要提供密碼。

若要預先填入登入名稱,請執行下列動作:

  1. 如果您使用自定義原則,請新增必要的輸入宣告,如 設定直接登入中所述。
  2. 尋找您的 Microsoft 驗證庫 (MSAL) 設定物件,然後加入包含登入提示的 withLoginHint() 方法。
let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority
parameters.loginHint = "bob@contoso.com"
// More settings here

applicationContext.acquireToken(with: parameters) { (result, error) in
...

預先選取識別提供者

如果您將應用程式的登入旅程設定為包含社交帳戶,例如 Facebook、LinkedIn 或 Google,您可以指定 domain_hint 參數。 此查詢參數會針對應該用於登入的社交識別提供者,提供 Azure AD B2C 的提示。 例如,如果應用程式指定 domain_hint=facebook.com,則登入流程會直接移至 Facebook 登入頁面。

若要將使用者重新導向至外部識別提供者,請執行下列動作:

  1. 檢查您的外部身份提供者的網域名稱。 如需詳細資訊,請參閱 將登入重新導向至社交提供者
  2. 建立或使用現有的清單對象來儲存額外的查詢參數。
  3. domain_hint將具有對應網域名稱的參數新增至清單(例如 , facebook.com
  4. 將額外的查詢參數清單傳遞至 MSAL 組態物件的 extraQueryParameters 屬性。
let extraQueryParameters: [String: String] = ["domain_hint": "facebook.com"]

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority
parameters.extraQueryParameters = extraQueryParameters
// More settings here

applicationContext.acquireToken(with: parameters) { (result, error) in
...

指定UI語言

Azure AD B2C 中的語言自定義可讓您的使用者流程適應各種語言,以符合客戶需求。 如需詳細資訊,請參閱 語言自定義

若要設定慣用的語言,請執行下列動作:

  1. 設定語言自定義
  2. 建立或使用現有的清單對象來儲存額外的查詢參數。
  3. ui_locales將具有對應語言程式代碼的參數新增至清單(例如, 。 en-us
  4. 將額外的查詢參數清單傳遞至 MSAL 組態物件的 extraQueryParameters 屬性。
let extraQueryParameters: [String: String] = ["ui_locales": "en-us"]

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority
parameters.extraQueryParameters = extraQueryParameters
// More settings here

applicationContext.acquireToken(with: parameters) { (result, error) in
...

傳遞自訂查詢字串參數

使用自定義原則,您可以傳遞自定義查詢字串參數。 良好的使用案例範例是當您想要 動態變更頁面內容時。

若要傳遞自訂查詢字串參數,請執行下列動作:

  1. 設定 ContentDefinitionParameters 元素。
  2. 建立或使用現有的清單對象來儲存額外的查詢參數。
  3. 新增自訂查詢字串參數,例如 campaignId。 設定參數值 (例如 , germany-promotion)。
  4. 將額外的查詢參數清單傳遞至 MSAL 組態物件的 extraQueryParameters 屬性。
let extraQueryParameters: [String: String] = ["campaignId": "germany-promotion"]

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority
parameters.extraQueryParameters = extraQueryParameters
// More settings here

applicationContext.acquireToken(with: parameters) { (result, error) in
...

傳遞 ID 令牌提示

信賴方應用程式可以在 OAuth2 授權請求中傳送傳入的 JSON Web 令牌 JWT。 輸入令牌提供有關用戶或授權請求的線索。 Azure AD B2C 會驗證令牌,然後提取索賠權。

若要在驗證要求中包含識別元令牌提示,請執行下列動作:

  1. 在您的自定義原則中,定義 ID 令牌提示技術設定檔
  2. 在您的程式代碼中,產生或取得識別元令牌,然後將令牌設定為變數(例如 , 。 idToken
  3. 建立或使用現有的清單對象來儲存額外的查詢參數。
  4. id_token_hint使用儲存標識元令牌的對應變數來新增 參數。
  5. 將額外的查詢參數清單傳遞至 MSAL 組態物件的 extraQueryParameters 屬性。
let extraQueryParameters: [String: String] = ["id_token_hint": idToken]

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority
parameters.extraQueryParameters = extraQueryParameters
// More settings here

applicationContext.acquireToken(with: parameters) { (result, error) in
...

設定日誌記錄

MSAL 連結庫會產生可協助診斷問題的記錄訊息。 應用程式可以設定記錄。 應用程式也可以讓您自定義控制詳細數據層級,以及是否記錄個人和組織數據。

建議您建立 MSAL 記錄回呼,並提供讓使用者在發生驗證問題時提交記錄的方式。 MSAL 提供以下記錄詳細層級:

  • 錯誤:發生問題,並產生錯誤。 此層級用於偵錯和識別問題。
  • 警告:不一定發生錯誤或失敗,但資訊適用於診斷和找出問題。
  • 資訊:MSAL 會記錄用於資訊用途的事件,而不一定用於偵錯。
  • 詳細資訊:這是預設層級。 MSAL 會記錄程式庫行為的完整詳細資訊。

根據預設,MSAL 記錄器不會擷取任何個人或組織數據。 如果您決定這麼做,程式庫會讓您選擇是否啟用個人和組織數據的記錄功能。

在提出任何 MSAL 要求之前,應盡早在應用程式啟動順序中設定 MSAL 記錄器。 在 AppDelegate.swift 方法中配置 MSAL application

下列代碼段示範如何設定 MSAL 記錄:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        MSALGlobalConfig.loggerConfig.logLevel = .verbose
        MSALGlobalConfig.loggerConfig.setLogCallback { (logLevel, message, containsPII) in
            
            // If PiiLoggingEnabled is set YES, this block will potentially contain sensitive information (Personally Identifiable Information), but not all messages will contain it.
            // containsPII == YES indicates if a particular message contains PII.
            // You might want to capture PII only in debug builds, or only if you take necessary actions to handle PII properly according to legal requirements of the region
            if let displayableMessage = message {
                if (!containsPII) {
                    #if DEBUG
                    // NB! This sample uses print just for testing purposes
                    // You should only ever log to NSLog in debug mode to prevent leaking potentially sensitive information
                    print(displayableMessage)
                    #endif
                }
            }
        }
        return true
    }

內嵌網頁檢視體驗

互動式驗證需要網頁瀏覽器。 根據預設,MSAL 函式庫會使用系統的網頁檢視。 登入期間,MSAL 程式庫會使用 Azure AD B2C 使用者介面彈出顯示 iOS 系統網頁檢視。

如需詳細資訊,請參閱 自定義適用於 iOS/macOS 的瀏覽器和 WebView 一文。

視您的需求而定,您可以使用內嵌 Web 檢視。 內嵌 Web 檢視與 MSAL 中的系統 Web 檢視之間有視覺和單一登錄行為差異。

顯示系統 Web 檢視體驗與內嵌 Web 檢視體驗差異的螢幕快照。

這很重要

我們建議您使用平台預設值,這通常是系統瀏覽器。 系統瀏覽器最好記住先前登入的使用者。 某些身分識別提供者,例如Google,不支援內嵌的檢視體驗。

若要變更此行為,請將 webviewTypeMSALWebviewParameters 屬性變更為 wkWebView。 下列範例示範如何將 Web 檢視類型變更為內嵌檢視:

func initWebViewParams() {
    self.webViewParameters = MSALWebviewParameters(authPresentationViewController: self)
    
    // Use embedded view experience
    self.webViewParameters?.webviewType = .wkWebView
}

後續步驟