适用于 iOS 的 Intune App SDK - 多标识

注意

本指南分为几个不同的阶段。 首先查看 第 1 阶段:规划集成

阶段 5:多标识 (可选)

默认情况下,SDK 将策略作为一个整体应用于应用。 多标识是一项 MAM 功能,可以启用该功能,以便在每个标识级别应用策略。 这需要比其他 MAM 功能更多的应用参与。

当应用打算更改活动标识时,应用必须通知应用 SDK。 当需要更改标识时,SDK 还会通知应用。 目前,仅支持一个托管标识。 用户注册设备或应用后,SDK 会使用此标识,并将其视为主要托管标识。 应用中的其他用户将被视为不受管理且不受限制的策略设置。

请注意,标识只是定义为字符串。 标识不区分大小写。 对 SDK 的标识请求可能不会返回设置标识时最初使用的相同大小写。

阶段Goals

  • 确定应用程序是否需要多标识支持。
  • 了解 Intune 应用 SDK 如何感知标识。
  • 重构应用程序以增强标识意识。
  • 添加代码以在整个应用程序中通知 SDK 活动标识和不断变化的标识。
  • 全面测试托管和非托管标识的应用保护策略强制实施。

标识概述

标识只是帐户的用户名, (例如 user@contoso.com ,) 。 开发人员可以在以下级别设置应用的标识:

  • 进程标识:设置进程范围的标识,主要用于单一标识应用程序。 此标识影响所有任务、文件和 UI。

  • UI 标识:确定哪些策略应用于main线程上的 UI 任务,例如剪切/复制/粘贴、PIN、身份验证和数据共享。 UI 标识不会影响加密和备份等文件任务。

  • 线程标识:影响在当前线程上应用的策略。 此标识影响所有任务、文件和 UI。

无论用户是否托管,应用都负责适当地设置标识。

在任何时候,每个线程都有一个有效的 UI 任务和文件任务标识。 这是用于检查应应用哪些策略(如果有)的标识。 如果标识为“无标识”或用户不受管理,则不会应用任何策略。 下图显示了如何确定有效标识。

Intune App SDK iOS:标识确定过程

线程队列

应用通常会将异步和同步任务调度到线程队列。 SDK 截获 Grand Central Dispatch (GCD) 调用,并将当前线程标识与已调度的任务相关联。 任务完成后,SDK 会暂时将线程标识更改为与任务关联的标识,完成任务,然后还原原始线程标识。

因为 NSOperationQueue 是在 GCD 的基础上构建的, NSOperations 因此在将任务添加到 NSOperationQueue时,将在线程的标识上运行。 NSOperations 直接通过 GCD 调度的 或 函数还可以在运行时更改当前线程标识。 此标识将覆盖从调度线程继承的标识。

在快速中,由于 SDK 如何传播 的 DispatchWorkItem标识,与 DispatchWorkItem 关联的标识是创建项的线程的标识,而不是调度项的线程的标识。

文件所有者

SDK 跟踪本地文件所有者的标识,并相应地应用策略。 创建文件或在截断模式下打开文件时,将建立文件所有者。 所有者设置为执行任务的线程的有效文件任务标识。

或者,应用可以使用 显式 IntuneMAMFilePolicyManager设置文件所有者标识。 应用可以使用 IntuneMAMFilePolicyManager 在显示文件内容之前检索文件所有者并设置 UI 标识。

共享数据

如果应用创建的文件包含来自托管和非托管用户的数据,则应用负责加密托管用户的数据。 可以使用 中的 IntuneMAMDataProtectionManagerunprotect API 加密数据protect

方法 protect 接受可以是托管或非托管用户的标识。 如果用户是托管的,则数据将被加密。 如果用户是非托管的,则将标头添加到对标识进行编码的数据,但数据不会加密。 可以使用 protectionInfo 方法检索数据的所有者。

共享扩展

如果应用具有共享扩展,则可以通过 中的 IntuneMAMDataProtectionManager方法检索protectionInfoForItemProvider共享项的所有者。 如果共享项是文件,则 SDK 将处理文件所有者的设置。 如果共享项是数据,则应用负责设置文件所有者(如果此数据保存到文件中),并在 UI 中显示此数据之前调用 setUIPolicyIdentity API。

启用多标识

默认情况下,应用被视为单一标识。 SDK 将进程标识设置为已注册的用户。 若要启用多标识支持,请将名称 MultiIdentity 为 YES 的布尔设置添加到应用的 Info.plist 文件中的 IntuneMAMSettings 字典。

注意

启用多标识后,进程标识、UI 标识和线程标识将设置为 nil。 应用负责适当地设置它们。

切换标识

  • 应用启动的标识开关

    启动时,多标识应用被视为在未知的非托管帐户下运行。 条件启动 UI 不会运行,并且不会对应用强制实施任何策略。 应用负责在应更改标识时通知 SDK。 通常,每当应用即将显示特定用户帐户的数据时,都会发生这种情况。

    例如,当用户尝试在笔记本中打开文档、邮箱或选项卡时。 在实际打开文件、邮箱或选项卡之前,应用需要通知 SDK。 这是通过 setUIPolicyIdentity 中的 IntuneMAMPolicyManagerAPI 完成的。 无论用户是否托管,都应调用此 API。 如果用户是托管的,SDK 将执行条件启动检查,例如越狱检测、PIN 和身份验证。

    标识切换的结果通过完成处理程序异步返回到应用。 应用应推迟打开文档、邮箱或选项卡,直到返回成功结果代码。 如果标识切换失败,应用应取消任务。

    多标识应用应避免使用 setProcessIdentity 作为设置标识的方法。 使用 UIScenes 的应用应使用 setUIPolicyIdentity:forWindow API 来设置标识。

    应用还可以使用 setCurrentThreadIdentity:setCurrentThreadIdentity:forScope:设置当前线程的标识。 例如,应用可能会生成后台线程,将标识设置为托管标识,然后对托管文件执行文件操作。 如果应用使用 setCurrentThreadIdentity:,则应用还应使用 getCurrentThreadIdentity ,以便在完成后可以还原原始标识。 但是,如果应用使用 setCurrentThreadIdentity:forScope: ,则会自动还原旧标识。 首选使用 setCurrentThreadIdentity:forScope:

    在快速中,由于 async/await, [IntuneMAMPolicyManager setCurrentThreadIdentity:] 不可用 [IntuneMAMPolicyManager setCurrentThreadIdentity:forScope:] 。 相反,若要快速设置当前标识,请使用 IntuneMAMSwiftContextManager.setIdentity(_, forScope:)。 此 API 有一些变体用于传入异步、引发和异步引发闭包。

  • SDK 启动的标识开关

    有时,SDK 需要要求应用切换到特定标识。 多标识应用必须在 中IntuneMAMPolicyDelegate实现 identitySwitchRequired 方法来处理此请求。

    调用此方法时,如果应用可以处理切换到指定标识的请求,则它应传入 IntuneMAMAddIdentityResultSuccess 完成处理程序。 如果它无法处理标识的切换,则应用应传入 IntuneMAMAddIdentityResultFailed 完成处理程序。

    应用不必调用 setUIPolicyIdentity 来响应此调用。 如果 SDK 需要应用切换到非托管用户帐户,空字符串将传入 identitySwitchRequired 调用。

  • SDK 发起的标识自动注册

    当 SDK 需要在应用中自动注册用户以执行操作时,应用必须在 中IntuneMAMPolicyDelegate实现 addIdentity:completionHandler: 方法。 然后,如果应用能够添加标识或 IntuneMAMAddIdentityResultFailed,则应用程序必须调用完成处理程序并传入 IntuneMAMAddIdentityResultFailed。

  • 选择性擦除

    选择性地擦除应用时,SDK 将在 中IntuneMAMPolicyDelegate调用 wipeDataForAccount 方法。 应用负责删除指定用户的帐户以及与该帐户关联的任何数据。 SDK 能够删除用户拥有的所有文件,如果应用从 wipeDataForAccount 调用中返回 FALSE,则它将这样做。

    请注意,此方法是从后台线程调用的。 如果应用返回 FALSE) ,则在删除除文件 (的所有用户数据之前,应用不应返回值。

退出条件

计划将大量时间用于验证应用的多标识集成。 开始测试之前:

  • 创建应用保护策略并将其分配给帐户。 这是测试托管帐户。
  • 创建另一个帐户,但不向其分配应用保护策略。 这是测试的非托管帐户。 或者,如果你的应用支持Microsoft Entra帐户以外的多种帐户类型,则可以使用现有的非 AAD 帐户作为非托管测试帐户。
  • 重新熟悉应用内策略的强制实施方式。 多标识测试要求你轻松区分应用在强制实施策略的情况下运行和未运行。 用于阻止屏幕截图的应用保护策略设置在快速测试策略强制实施时有效。
  • 请考虑应用提供的整个 UI 集。 枚举显示帐户数据的屏幕。 你的应用是否只一次显示单个帐户的数据,或者它可以同时显示属于多个帐户的数据?
  • 请考虑应用创建的整个文件集。 枚举其中哪些文件包含属于帐户的数据,而不是系统级数据。
    • 确定对其中每个文件验证加密的方式。
  • 请考虑应用可以与其他应用交互的整套方式。 枚举所有入口点和出口点。 应用可以引入哪些类型的数据? 它广播的意图是什么? 它实现哪些内容提供商?
    • 确定将如何练习其中每个数据共享功能。
    • 准备一个测试设备,该设备同时具有可以与应用交互的托管和非托管应用。
  • 考虑应用如何使最终用户能够与所有登录帐户交互。 用户是否需要在显示该帐户的数据之前手动切换到该帐户?

全面评估应用当前行为后,通过执行以下测试集来验证多标识集成。 请注意,这不是一个全面的列表,并且不保证应用的多标识实现是无 bug 的。

验证登录和注销方案

多标识应用最多支持 1 个托管帐户和多个非托管帐户。 这些测试有助于确保多标识集成不会在用户登录或注销时不正确地更改保护。

对于这些测试,请在测试设备上安装应用;在开始测试之前不要登录。

应用场景 步骤
首先登录托管 - 首先使用托管帐户登录,并验证帐户的数据是否托管。
- 使用非托管帐户登录,并验证该帐户的数据不受管理。
首先登录非托管 - 首先使用非托管帐户登录,并验证该帐户的数据不受管理。
- 使用托管帐户登录并验证帐户的数据是否托管。
登录多个托管 - 首先使用托管帐户登录,并验证帐户的数据是否托管。
- 使用第二个托管帐户登录,并验证是否阻止用户登录,而无需先删除原始托管帐户。
注销托管 - 使用托管的非托管帐户登录到应用。
- 注销托管帐户。
- 确认已从应用中删除托管帐户,并且已删除该帐户的所有数据。
- 确认非托管帐户仍处于登录状态,未删除任何非托管帐户的数据,并且策略仍未应用。
注销非托管 - 使用托管的非托管帐户登录到应用。
- 注销非托管帐户。
- 确认已从应用中删除非托管帐户,并且已删除该帐户的所有数据。
- 确认托管帐户仍处于登录状态,未删除任何非托管帐户的数据,并且策略仍在应用。

验证活动标识和应用生命周期

多标识应用可能会显示具有单个帐户数据的视图,并允许用户显式更改当前正在使用的帐户。 它还可能同时显示包含多个帐户数据的视图。 这些测试有助于确保多标识集成在整个应用生命周期内为每个页面上的活动标识提供适当的保护。

对于这些测试,请在测试设备上安装应用;在开始测试之前,使用托管帐户和非托管帐户登录。

应用场景 步骤
单帐户视图,托管 - 切换到托管帐户。
- 导航到应用中显示单个帐户数据的所有页面。
- 确认策略已应用于每个页面。
单帐户视图,非托管 - 切换到非托管帐户。
- 导航到应用中显示单个帐户数据的所有页面。
- 确认策略未应用于任何页面。
多帐户视图 - 导航到应用中同时显示多个帐户数据的所有页面。
- 确认策略已应用于每个页面。
托管暂停 - 在显示托管数据并激活策略的屏幕上,导航到设备主屏幕或其他应用来暂停应用。
- 恢复应用。
- 确认仍应用策略。
非托管暂停 - 在显示非托管数据且未激活策略的屏幕上,导航到设备主屏幕或其他应用来暂停应用。
- 恢复应用。
- 确认策略未应用。
托管终止 - 在显示托管数据并激活策略的屏幕上,强制终止应用。
- 重启应用。
- 确认如果应用在屏幕上恢复,且托管帐户的数据 (预期) ,仍会应用策略。 如果应用在具有非托管帐户数据的屏幕上恢复,请确认该策略未应用。
非托管终止 - 在显示非托管数据并激活策略的屏幕上,强制终止应用。
- 重启应用。
- 确认如果应用在具有非托管帐户数据 (预期) 的屏幕上恢复,则不会应用策略。 如果应用在包含托管帐户数据的屏幕上恢复,请确认仍应用策略。
即席标识切换 - 尝试在帐户之间切换以及暂停/恢复/终止/重启应用。
- 确认托管帐户的数据始终受到保护,非托管帐户的数据永远不会受到保护。

验证数据共享方案

多标识应用可能会向其他应用发送数据以及从其他应用接收数据。 Intune 的应用保护策略具有指示此行为的设置。 这些测试有助于确保多标识集成遵循这些数据共享设置。

对于这些测试,请在测试设备上安装应用;在开始测试之前,使用托管帐户和非托管帐户登录。 此外:

  • 将托管帐户的策略设置为:
    • “将组织数据发送到其他应用”到“策略托管应用”。
    • “从其他应用接收数据”到“策略托管应用”。
  • 在测试设备上安装其他应用:
    • 一个托管应用,其目标策略与应用相同,可以发送和接收数据 (,如 Microsoft Outlook) 。
    • 可以发送和接收数据的任何非托管应用。
  • 使用托管测试帐户登录到其他托管应用。 即使其他托管应用是多标识,也只能使用托管帐户登录。

如果你的应用能够将数据发送到其他应用,例如 Microsoft Outlook 向 Microsoft Office 发送文档附件:

应用场景 步骤
将托管标识发送到非托管应用 - 切换到托管帐户。
- 导航到应用可以发送数据的位置。
- 尝试将数据发送到非托管应用。
- 应阻止你将数据发送到非托管应用。
将托管标识发送到托管应用 - 切换到托管帐户。
- 导航到应用可以发送数据的位置。
- 尝试将数据发送到已登录托管帐户的其他托管应用。
- 应允许将数据发送到托管应用。
将非托管标识发送到托管应用 - 切换到非托管帐户。
- 导航到应用可以发送数据的位置。
- 尝试将数据发送到已登录托管帐户的其他托管应用。
- 应阻止你将数据发送到其他托管应用。
将非托管标识发送到非托管应用 - 切换到非托管帐户。
- 导航到应用可以发送数据的位置。
- 尝试将数据发送到非托管应用。
- 应始终允许将非托管帐户的数据发送到非托管应用。

你的应用可能会主动从其他应用导入数据,例如从 Microsoft OneDrive 附加文件的 Microsoft Outlook。 你的应用也可能被动接收来自其他应用的数据,例如 Microsoft Office 从 Microsoft Outlook 附件打开文档。 接收应用保护策略设置涵盖这两种方案。

如果你的应用能够主动从其他应用导入数据:

应用场景 步骤
从非托管应用导入托管标识 - 切换到托管帐户。
- 导航到应用可以从其他应用导入数据的位置。
- 尝试从非托管应用导入数据。
- 应阻止你从非托管应用导入数据。
从托管应用导入托管标识 - 切换到托管帐户。
- 导航到应用可以从其他应用导入数据的位置。
- 尝试从已登录托管帐户的其他托管应用导入数据。
- 应允许从其他托管应用导入数据。
从托管应用导入非托管标识 - 切换到非托管帐户。
- 导航到应用可以从其他应用导入数据的位置。
- 尝试从已登录托管帐户的其他托管应用导入数据。
- 应阻止你从其他托管应用导入数据。
从非托管应用导入非托管标识 - 切换到非托管帐户。
- 导航到应用可以从其他应用导入数据的位置。
- 尝试从非托管应用导入数据。
- 应始终允许从非托管帐户的非托管应用导入数据。

如果你的应用能够被动接收来自其他应用的数据:

应用场景 步骤
从非托管应用接收托管标识 - 切换到托管帐户。
- 切换到非托管应用。
- 导航到可以发送数据的位置。
- 尝试将数据从非托管应用发送到你的应用。
- 应用的托管帐户无法从非托管应用接收数据。
从托管应用接收托管标识 - 切换到托管帐户。
- 切换到已登录托管帐户的其他托管应用。
- 导航到可以发送数据的位置。
- 尝试将数据从托管应用发送到应用。
- 应允许应用的托管帐户从其他托管应用接收数据。
从托管应用接收非托管标识 - 切换到非托管帐户。
- 切换到已登录托管帐户的其他托管应用。
- 导航到可以发送数据的位置。
- 尝试将数据从托管应用发送到应用。
- 你的应用的非托管帐户无法从托管应用接收数据。
从非托管应用接收非托管标识 - 切换到非托管帐户。
- 切换到非托管应用。
- 导航到可以发送数据的位置。
- 尝试将数据从非托管应用发送到你的应用。
- 应始终允许应用的非托管帐户从非托管应用接收数据。

这些测试中的失败可能表示应用在尝试发送或接收数据时没有设置正确的活动标识。 可以通过在发送/接收时利用 SDK 的 get 标识 API 来调查此问题,以确认活动标识是否已正确设置。

后续步骤

完成上述所有 退出条件 后,你的应用现在已成功集成为多标识,并且可以基于每个标识强制实施应用保护策略。 后续部分 (阶段 6:应用保护条件访问支持阶段 7:Web 视图功能)可能是必需的,也可能不需要,具体取决于应用所需的应用保护策略支持。