适用于 iOS 设备的共享设备模式

一线工作者(例如零售职员、机组人员和现场服务工人)通常使用共享移动设备来完成其工作。 如果用户共享其密码或 PIN(不管是有意还是无意)来访问共享设备上的客户和数据业务数据,那么这些共享设备可能会有安全风险。

使用共享设备模式,能够将 iOS 14 或更高版本的设备配置为可由员工更轻松、更安全地共享。 员工可以登录一次,并对所有支持单点登录 (SSO) 的应用程序使用 SSO,从而更快地访问信息。 当他们完成轮班或任务后,他们可以通过任何受支持的应用程序从设备退出登录,这样也会使他们从支持该功能的所有应用程序中退出登录,同时,设备将立即可供下一位员工使用,并且后续用户无法访问以前用户的数据。

要利用共享设备模式功能,需要应用程序开发人员和云设备管理员配合工作:

  1. 设备管理员使用 Microsoft Intune 等移动设备管理 (MDM) 提供程序来准备好要共享的设备。 MDM 将 Microsoft Authenticator 应用程序推送到设备,并通过设备的配置文件更新来为每台设备启用“共享模式”。 正是此“共享模式”设置更改了设备上受支持应用的行为。 MDM 提供程序中的此项配置为设备设置共享设备模式,并启用共享设备模式所需的适用于 Apple 设备的 Microsoft 企业 SSO 插件。 若要详细了解 SSO 扩展,请参阅 Apple 视频

  2. 应用程序开发人员编写单帐户应用程序(共享设备模式不支持多帐户应用程序)来处理以下场景:

    • 通过任何受支持的应用程序在整个设备上将用户登录 。
    • 通过任何受支持的应用程序在整个设备上将用户注销 。
    • 查询设备的状态,以确定应用程序是否位于处于共享设备模式的设备上 。
    • 查询设备上用户的设备状态,以确定自上次使用应用程序以来是否发生了任何更改 。

    支持共享设备模式应被视为应用程序的一项功能升级,并且会有助于在多个用户使用同一设备的环境中提升该应用程序的采用率。

    重要

    在 iOS 上支持共享设备模式的 Microsoft 应用程序不需要进行任何更改,只需在设备上安装即可获得共享设备模式带来的好处。

为设备设置共享设备模式

需要将设备配置为支持共享设备模式。 必须在该设备上安装 iOS 14+,并将该设备注册到 MDM。 MDM 配置还需要启用适用于 Apple 设备的 Microsoft 企业 SSO 插件

Microsoft Intune 支持对 Microsoft Entra 共享设备模式下的设备进行零接触预配,这意味着可以直接在 Intune 中设置和注册设备,几乎不需要与一线工作人员互动。 若要在将 Microsoft Intune 用作 MDM 时为设备设置共享设备模式,请参阅在 Microsoft Entra 共享设备模式下为设备设置注册

重要

我们正在与第三方 MDM 合作,以支持共享设备模式。 当第三方 MDM 开始支持共享设备模式时,我们将更新相应的列表。

修改 iOS 应用程序以支持共享设备模式

用户依赖于你来确保其数据不会泄露给其他用户。 以下部分提供了有用的信号,用于向应用程序指示已发生了需要处理的更改。

每次使用应用时,你都要负责检查设备上用户的状态,并清除上一个用户的数据。 这还包括检查应用是不是从正在执行多个任务的后台重新加载的。

发生用户更改后,你应确保前一个用户的数据已清除,并且应用程序中显示的所有缓存数据已删除。 我们强烈建议你和你的公司在更新应用以支持共享设备模式之后,执行安全评审过程。

检测共享设备模式

检测共享设备模式对于应用程序而言非常重要。 许多应用程序在共享设备上使用时,都需要改变用户体验 (UX)。 例如,应用程序可能会提供一个“注册”功能,而该功能并不适用于一线工作者,因为他们可能已有一个帐户。 如果应用程序处于共享设备模式,你还可能想要为应用程序的数据处理添加额外的安全性。

使用 MSALPublicClientApplication 中的 getDeviceInformationWithParameters:completionBlock: API 确定应用是否正在处于共享设备模式的设备上运行。

以下代码片段演示使用 getDeviceInformationWithParameters:completionBlock: API 的示例。

Swift

application.getDeviceInformation(with: nil, completionBlock: { (deviceInformation, error) in

    guard let deviceInfo = deviceInformation else {
        return
    }

    let isSharedDevice = deviceInfo.deviceMode == .shared
    // Change your app UX if needed
})

Objective-C

[application getDeviceInformationWithParameters:nil
                                completionBlock:^(MSALDeviceInformation * _Nullable deviceInformation, NSError * _Nullable error)
{
    if (!deviceInformation)
    {
        return;
    }

    BOOL isSharedDevice = deviceInformation.deviceMode == MSALDeviceModeShared;
    // Change your app UX if needed
}];

获取已登录用户并确定该设备上的用户是否已更改

支持共享设备模式的另一个重要部分是确定设备上用户的状态,并在设备上的用户已更改或者设备上根本没有任何用户时清除应用程序数据。 你需要负责确保数据不会泄露给其他用户。

可以使用 getCurrentAccountWithParameters:completionBlock: API 查询设备上当前已登录的帐户。

Swift

let msalParameters = MSALParameters()
msalParameters.completionBlockQueue = DispatchQueue.main

application.getCurrentAccount(with: msalParameters, completionBlock: { (currentAccount, previousAccount, error) in

    // currentAccount is the currently signed in account
    // previousAccount is the previously signed in account if any
})

Objective-C

MSALParameters *parameters = [MSALParameters new];
parameters.completionBlockQueue = dispatch_get_main_queue();

[application getCurrentAccountWithParameters:parameters
                             completionBlock:^(MSALAccount * _Nullable account, MSALAccount * _Nullable previousAccount, NSError * _Nullable error)
{
    // currentAccount is the currently signed in account
    // previousAccount is the previously signed in account if any
}];

将用户全局登录

将设备配置为共享设备后,应用程序可以调用 acquireTokenWithParameters:completionBlock: API 将帐户登录。 第一个应用将帐户登录后,该帐户将全局性地可供设备上所有符合条件的应用使用。

Objective-C

MSALInteractiveTokenParameters *parameters = [[MSALInteractiveTokenParameters alloc] initWithScopes:@[@"api://myapi/scope"] webviewParameters:[self msalTestWebViewParameters]];

parameters.loginHint = self.loginHintTextField.text;

[application acquireTokenWithParameters:parameters completionBlock:completionBlock];

将用户全局注销

以下代码将删除已登录的帐户,并且不仅从应用中清除缓存的令牌,而且还从处于共享设备模式下的设备中清除缓存的令牌。 不过,它不会清除应用程序中的数据。 你必须清除应用程序中的数据,并清除应用程序可能会向用户显示的所有缓存数据。

Swift

let account = .... /* account retrieved above */

let signoutParameters = MSALSignoutParameters(webviewParameters: self.webViewParamaters!)
signoutParameters.signoutFromBrowser = true // To trigger a browser signout in Safari.

application.signout(with: account, signoutParameters: signoutParameters, completionBlock: {(success, error) in
    if let error = error {

        // Signout failed

        return

    }

    // Sign out completed successfully

})

Objective-C

MSALAccount *account = ... /* account retrieved above */;

MSALSignoutParameters *signoutParameters = [[MSALSignoutParameters alloc] initWithWebviewParameters:webViewParameters];

signoutParameters.signoutFromBrowser = YES; // To trigger a browser signout in Safari.

[application signoutWithAccount:account signoutParameters:signoutParameters completionBlock:^(BOOL success, NSError * _Nullable error)

{

    if (!success)

    {

        // Signout failed

        return;

    }

    // Sign out completed successfully

}];

适用于 Apple 设备的 Microsoft 企业 SSO 插件只会为应用程序清除状态。 它不会清除 Safari 浏览器中的状态。 可以使用上述代码片段中显示的可选 signoutFromBrowser 属性在 Safari 中触发浏览器注销。 这会导致在设备上短暂启动浏览器。

接收广播以检测从其他应用程序启动的全局注销

若要接收帐户更改广播,需要注册广播接收器。 接收到帐户更改广播后,立即获取已登录用户,并确定设备上的用户是否已更改。 如果检测到更改,则为以前登录的帐户启动数据清理。 建议适当停止任何操作,并进行数据清理。

以下代码片段演示如何注册广播接收器。

NSString *const MSAL_SHARED_MODE_CURRENT_ACCOUNT_CHANGED_NOTIFICATION_KEY = @"SHARED_MODE_CURRENT_ACCOUNT_CHANGED";

- (void) registerDarwinNotificationListener 

{ 

   CFNotificationCenterRef center =

   CFNotificationCenterGetDarwinNotifyCenter(); 

   CFNotificationCenterAddObserver(center, nil,

   sharedModeAccountChangedCallback,

   (CFStringRef)MSAL_SHARED_MODE_CURRENT_ACCOUNT_CHANGED_NOTIFICATION_KEY, 

   nil, CFNotificationSuspensionBehaviorDeliverImmediately); 

} 

// CFNotificationCallbacks used specifically for Darwin notifications leave userInfo unused 

void sharedModeAccountChangedCallback(CFNotificationCenterRef center, void * observer, CFStringRef name, void const * object, __unused CFDictionaryRef userInfo) 

{ 

    // Invoke account cleanup logic here 

} 

有关 CFNotificationAddObserver 的可用选项的详细信息,或者若要查看 Swift 中的相应方法签名,请参阅:

对于 iOS,你的应用程序需要后台权限才能在后台保持活动状态并侦听 Darwin 通知。 必须添加后台功能才能支持不同的后台操作 - 如果你的应用只有侦听 Darwin 通知的后台功能,它可能会被 Apple App Store 拒绝。 如果你的应用已配置为完成后台操作,则可以在该操作的过程中添加侦听器。 有关 iOS 后台功能的详细信息,请参阅配置后台执行模式

支持共享设备模式的 Microsoft 应用程序

以下 Microsoft 应用程序支持 Microsoft Entra 共享设备模式:

重要

公共预览版在提供时没有附带服务级别协议,不建议用于生产工作负荷。 部分功能可能不受支持或者受限。 有关详细信息,请参阅联机服务的通用许可条款

后续步骤

GitHub 上的以下代码示例可帮助你了解共享设备模式的运作方式,该示例演示如何在处于共享设备模式的 iOS 设备上运行某个一线工作者应用:

MSAL iOS Swift Microsoft Graph API 示例