应用保护条件访问会阻止访问服务器令牌,直到 Intune 确认应用保护策略已应用。 此功能需要对添加用户流进行更改。 客户启用应用保护 CA 后,该客户租户中访问受保护资源的应用程序将无法获取访问令牌,除非它们支持此功能。
注意
本指南分为几个不同的阶段。 首先查看 第 1 阶段:规划集成。
阶段 6:应用保护 CA 支持
阶段Goals
- 了解可用于在 iOS 应用中支持应用保护条件访问的不同 API
 - 将应用保护条件访问集成到应用和用户。
 - 测试上述与应用和用户的集成。
 
相关性
除了 Intune SDK 之外,还需要这两个组件才能在应用中启用应用保护 CA。
- iOS Authenticator 应用
 - MSAL 身份验证库 1.0 或更高版本
 
MAM-CA 修正流
MAM 合规性流程流
新 API
大多数新 API 都可以在 IntuneMAMComplianceManager.h 中找到。 应用需要注意下面所述的三种行为差异。
| 新行为 | 说明 | 
|---|---|
| 应用→ ADAL/MSAL:获取令牌 | 当应用程序尝试获取令牌时,应准备好接收ERROR_SERVER_PROTECTION_POLICY_REQUIRED。 应用在其初始帐户添加流期间或在应用程序生命周期的稍后访问令牌时,可能会收到此错误。 当应用收到此错误时,不会向其授予访问令牌,并且需要修正以检索任何服务器数据。 | 
| 应用→ Intune SDK:调用修正ComplianceForIdentity | 当应用收到来自 ADAL 或 MSALErrorServerProtectionPoliciesRequired 的ERROR_SERVER_PROTECTION_POLICY_REQUIRED时,它应调用 [[IntuneMAMComplianceManager 实例] remediateComplianceForIdentity] 让 Intune 注册应用并应用策略。 在此调用期间,应用可能会重启。 如果应用需要在重启前保存状态,则可以在 IntuneMAMPolicyDelegate 中的 restartApplication 委托方法中执行此作。  remediateComplianceForIdentity 提供 registerAndEnrollAccount 和 loginAndEnrollAccount 的所有功能。 因此,应用不需要使用这些较旧的 API 之一。  | 
| Intune →应用:委托修正通知 | 在 Intune 检索并应用策略后,它会使用 IntuneMAMComplianceDelegate 协议通知应用结果。 有关应用应如何处理每个错误的信息,请参阅 IntuneComplianceManager.h 中的 IntuneMAMComplianceStatus。 在除 IntuneMAMComplianceCompliant 之外的所有情况下,用户将没有有效的访问令牌。  如果应用已有托管内容并且无法输入合规状态,则应用程序应调用选择性擦除以删除任何公司内容。 如果无法达到合规状态,应用应显示由ErrorMessage 和 andErrorTitle 提供的本地化错误消息和标题字符串。  | 
IntuneMAMComplianceDelegate 的 hasComplianceStatus 方法的示例
(void) accountId:(NSString*_Nonnull) accountId hasComplianceStatus:(IntuneMAMComplianceStatus) status withErrorMessage:(NSString*_Nonnull) errMsg andErrorTitle:(NSString*_Nonnull) errTitle
{
    switch(status)
    {
        case IntuneMAMComplianceCompliant:
        {
            /*
            Handle successful compliance
            */
            break;
        }
        case IntuneMAMComplianceNotCompliant:
        case IntuneMAMComplianceNetworkFailure:
        case IntuneMAMComplianceUserCancelled:
        case IntuneMAMComplianceServiceFailure:
        {
            UIAlertController* alert = [UIAlertController alertControllerWithTitle:errTitle
            message:errMsg
            preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
            handler:^(UIAlertAction * action) {exit(0);}];
            [alert addAction:defaultAction];
            dispatch_async(dispatch_get_main_queue(), ^{
            [self presentViewController:alert animated:YES completion:nil];
            });
            break;
        }
        case IntuneMAMComplianceInteractionRequired:
        {
            [[IntuneMAMComplianceManager instance] remediateComplianceForAccountId:accountId silent:NO];
            break;
        }
    }
}
func accountId(_ accountId: String, hasComplianceStatus status: IntuneMAMComplianceStatus, withErrorMessage errMsg: String, andErrorTitle errTitle: String) {
        switch status {
        case .compliant:
           //Handle successful compliance
        case .notCompliant, .networkFailure,.serviceFailure,.userCancelled:
            DispatchQueue.main.async {
              let alert = UIAlertController(title: errTitle, message: errMsg, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                    exit(0)
                }))
                self.present(alert, animated: true, completion: nil)
            }
        case .interactionRequired:
            IntuneMAMComplianceManager.instance().remediateCompliance(forAccountId: accountId, silent: false)
   }
MSAL/ADAL
应用需要通过将客户端功能变量添加到其 MSAL/ADAL 配置来指示对应用保护 CA 的支持。 以下值是必需的:claims = {“access_token”:{“xms_cc”:{“values”:[“protapp”]}}}
MSALPublicClientApplicationConfig 类参考 (azuread.github.io)
    MSALAADAuthority *authority = [[MSALAADAuthority alloc] initWithURL:[[NSURL alloc] initWithString:IntuneMAMSettings.aadAuthorityUriOverride] error:&msalError];
    MSALPublicClientApplicationConfig *config = [[MSALPublicClientApplicationConfig alloc]
                                                 initWithClientId:IntuneMAMSettings.aadClientIdOverride
                                                 redirectUri:IntuneMAMSettings.aadRedirectUriOverride
                                                 authority:authority];
    /*
     IF YOU'RE IMPLEMENTING CA IN YOUR APP, PLEASE PAY ATTENTION TO THE FOLLOWING...
    */
    // This is needed for CA!
    // This line adds an option to the MSAL token request so that MSAL knows that CA may be active
    // Without this, MSAL won't know that CA could be activated
    // In the event that CA is activated and this line isn't in place, the auth flow will fail
    config.clientApplicationCapabilities = @[@"protapp"];
guard let authorityURL = URL(string: kAuthority) else {
            print("Unable to create authority URL")
            return
        }
         let authority = try MSALAADAuthority(url: authorityURL)
         let msalConfiguration = MSALPublicClientApplicationConfig(clientId: kClientID,redirectUri: kRedirectUri,
                                                                  authority: authority)
        msalConfiguration.clientApplicationCapabilities = ["ProtApp"]
        self.applicationContext = try MSALPublicClientApplication(configuration: msalConfiguration)
若要提取 MAM SDK 符合性修正 API 的 accountId 参数的 Microsoft Entra 对象 ID,需要执行以下步骤:
- 当 MSAL 向应用报告ERROR_SERVER_PROTECTION_POLICY_REQUIRED时,首先从 MSALError 对象中的 userInfo[MSALHomeAccountIdKey] 获取 homeAccountId。
 - 此 homeAccountId 的格式为 ObjectId.TenantId。 通过拆分“.”上的字符串提取 ObjectId 值,然后将该值用于修正 API remediateComplianceForAccountId 中的 accountId 参数。
 
退出条件
为应用保护 CA 配置测试用户
- 使用管理员凭据 https://portal.azure.com登录到 。
 - 选择“Microsoft Entra ID>条件访问>创建新策略”。 创建新的条件访问策略。
 - 通过设置以下项来配置条件访问策略:
- 填写 “名称” 字段。
 - 启用策略。
 - 将策略分配给用户或组。
 
 - 分配云应用。 选择“ 包括>所有云应用”。 正如警告所指出的,请注意不要错误地配置此设置。 例如,如果排除了所有云应用,则会将自己锁定在控制台之外。
 - 通过选择“>访问控制授予访问权限需要应用保护策略”来授予访问控制>。
 - 完成策略配置后,选择“ 创建 ”以保存并应用策略。
 - 启用策略。
 - 还需要确保用户成为 MAM 策略的目标。
 
测试用例
| 测试用例 | 如何测试 | 预期结果 | 
|---|---|---|
| 始终应用 MAM-CA | 在注册应用之前,请确保用户针对应用保护 CA 和 MAM 策略。 | 验证你的应用是否处理了上述修正情况,并且应用能否获取访问令牌。 | 
| 在用户注册后应用 MAM-CA | 用户应已登录到应用,但不是应用保护 CA 的目标。 | 在控制台中面向应用保护 CA 的用户,并验证是否正确处理 MAM 修正 | 
| MAM-CA 不符合 | 设置应用保护 CA 策略,但不分配 MAM 策略。 | 用户应无法获取访问令牌。 这对于测试应用如何处理 IntuneMAMComplianceStatus 错误案例非常有用。 | 
后续步骤
完成上述所有 退出条件 后,你的应用现在已成功与应用保护 CA 支持集成。 后续部分 阶段 7:Web 视图功能 可能是必需的,也可能不需要,具体取决于应用所需的应用保护策略支持。