Intune App SDK for iOS - 應用程式保護 CA 支援 (選擇性)
應用程式保護條件式存取會封鎖對伺服器令牌的存取,直到 Intune 確認已套用應用程式保護原則為止。 這項功能需要變更您的新增使用者流程。 一旦客戶啟用應用程式保護 CA,除非客戶支援這項功能,否則該客戶租使用者中存取受保護資源的應用程式將無法取得存取令牌。
注意事項
本指南分成數個不同的階段。 從檢閱 階段 1:規劃整合開始。
階段 6:應用程式保護 CA 支援
階段 Goals
- 瞭解可用於支援 iOS 應用程式內應用程式保護條件式存取的不同 API
- 將應用程式保護條件式存取整合到您的應用程式和使用者。
- 測試與您的應用程式和使用者的上述整合。
相依性
除了 Intune SDK,您還需要這兩個元件,才能在應用程式中啟用應用程式保護 CA。
- iOS 驗證器應用程式
- MSAL 驗證連結庫 1.0 或更新版本
MAM-CA 補救流程
MAM 合規性程式流程
新的 API
大部分的新 API 都可以在 IntuneMAMComplianceManager.h 中找到。 應用程式必須留意下列三種行為差異。
新行為 | 描述 |
---|---|
應用程式→ ADAL/MSAL:取得令牌 | 當應用程式嘗試取得令牌時,應該準備好接收ERROR_SERVER_PROTECTION_POLICY_REQUIRED。 應用程式在其初始帳戶新增流程期間或稍後在應用程式生命週期中存取令牌時,可能會收到此錯誤。 當應用程式收到此錯誤時,將不會被授與存取令牌,而且需要修復才能擷取任何伺服器數據。 |
應用程式→ Intune SDK:呼叫 remediateComplianceForIdentity | 當應用程式收到來自 ADAL 的ERROR_SERVER_PROTECTION_POLICY_REQUIRED或 MSALErrorServerProtectionPoliciesRequired 時,應該呼叫 [[IntuneMAMComplianceManager 實例] remediateComplianceForIdentity],讓 Intune 註冊應用程式並套用原則。 此呼叫期間可能會重新啟動應用程式。 如果應用程式需要在重新啟動之前儲存狀態,它可以在 IntuneMAMPolicyDelegate 的 restartApplication 委派方法中儲存狀態。 remediateComplianceForIdentity 提供 registerAndEnrollAccount 和 loginAndEnrollAccount 的所有功能。 因此,應用程式不需要使用這其中一個較舊的 API。 |
Intune→應用程式:委派補救通知 | Intune 擷取並套用原則之後,它會使用IntuneMAMComplianceDelegate 通訊協定通知應用程式結果。 如需應用程式應如何處理每個錯誤的資訊,請參閱 IntuneComplianceManager.h 中的 IntuneMAMComplianceStatus。 在 IntuneMAMComplianceComplianceCompliant 以外的所有情況下,使用者都不會有有效的存取令牌。 如果應用程式已經有受控內容,而且無法進入符合規範的狀態,應用程式應該呼叫選擇性抹除來移除任何公司內容。 如果我們無法達到符合規範的狀態,應用程式應該會顯示由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 的支援。 需要下列值:宣告 = {“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 物件識別符,您需要執行下列步驟:
- 在 MSAL 向應用程式回報ERROR_SERVER_PROTECTION_POLICY_REQUIRED時,首先從 MSAL 傳回的 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 支援整合。 The subsequent section, Stage 7: Web-view features may or may not be required, depending on your app's desired app protection policy support.