你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure AD B2C 在 iOS Swift 应用中启用身份验证选项

本文介绍如何启用、自定义和增强 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 中使用自定义域和租户 ID,请执行以下操作:

  1. 请遵循启用自定义域中的指导。
  2. kAuthorityHostName 类成员更新为你的自定义域。
  3. kTenantName 类成员更新为你的租户 ID

以下 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 会验证令牌,然后提取声明。

要在身份验证请求中包含 ID 令牌提示,请执行以下操作:

  1. 在自定义策略中,定义 ID 令牌提示技术配置文件
  2. 在代码中,生成或获取 ID 令牌,然后将令牌设置为变量(如 idToken)。
  3. 创建或使用现有列表对象来存储额外的查询参数。
  4. 使用可存储 ID 令牌的相应变量添加 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 application 方法中配置 MSAL 日志记录

下面的代码片段演示如何配置 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
    }

嵌入式 Web 视图体验

交互式身份验证需要使用 Web 浏览器。 默认情况下,MSAL 库使用系统 Web 视图。 在登录期间,MSAL 库会弹出带有 Azure AD B2C 用户界面的 iOS 系统 Web 视图。

有关详细信息,请参阅针对 iOS/macOS 自定义浏览器和 Web 视图一文。

根据你的要求,你可以使用嵌入式 Web 视图。 MSAL 中的嵌入式 Web 视图和系统 Web 视图之间存在视觉和单一登录行为差异。

屏幕截图展示系统 Web 视图体验和嵌入式 Web 视图体验之间的差异。

重要

建议使用平台默认值,通常为系统浏览器。 系统浏览器能够更好地记住以前登录的用户。 某些标识提供者(如 Google)不支持嵌入式视图体验。

要更改此行为,请将 MSALWebviewParameterswebviewType 属性更改为 wkWebView。 以下示例演示了如何将 Web 视图类型更改为嵌入式视图:

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

后续步骤