Android 版 Microsoft Intune App SDK 允許你將Intune 應用程式保護政策 (也稱為 MAM 政策) 整合到原生的 Java/Kotlin Android 應用程式中。 Intune 管理的應用程式是指與 Intune 應用程式 SDK 整合的應用程式。 當 Intune 主動管理應用程式時,Intune 管理員可以輕鬆部署應用程式保護政策到您的 Intune 管理應用程式。
注意事項
本指南分為數個不同階段。 先從複習 第一階段:規劃整合開始。
第五階段:多重身份
賽段目標
- 判斷您的應用程式是否需要多重身份支援。
- 了解 Intune App SDK 如何感知身份。
- 重構你的申請以提升身份意識。
- 新增程式碼,讓 SDK 知道應用程式中活躍與變動的身份。
- 徹底測試受管理與非受管理身份的應用程式保護政策執行。
恆等式術語
「使用者」、「帳號」與「身份」這三個詞常被交替使用。 本指南嘗試區分如下:
- 使用者:使用軟體產品的人類。 進一步區分為終端用戶、使用 Android 應用程式的人類,以及管理員 / 管理員 / IT / 管理員 IT Pro,使用 Microsoft Intune 管理中心的人類。
- 帳戶:屬於組織的軟體紀錄,唯一識別使用者實體。 一個人類使用者可以擁有多個帳號。
- 身份:Intune App SDK 用來唯一識別帳戶的資料集合。
Background
預設情況下,Intune App SDK 會套用政策給整個應用程式。 註冊一個設定為應用程式保護政策的帳號後,SDK 會將每個檔案和每個活動與該帳號的身份關聯,並會普遍套用該帳號的目標政策。
對許多開發者來說,這是他們應用程式期望的保護行為。 這些應用程式被視為 單一身份。 完成前幾步後,您的應用程式已成功整合為單一身份,並能執行所有基本政策。 原本打算保持單一身份的應用程式可以跳過此區,直接進入第六階段:應用程式組態。
Intune App SDK 可選擇性地在每個身份層級強制執行政策。 如果您的應用程式已經支援多個帳號同時登入,且您希望透過應用程式保護政策保留多帳號支援,您的應用程式被視為 多重身份。
提示
如果您不確定應用程式應支援單一身份還是多身份保護,請重新檢視 「我的應用程式是單一身份還是多身份?」
警告
支援多重身份比其他應用程式保護功能複雜許多。 多重身份整合不當可能導致資料外洩及其他安全問題。 請仔細複習此部分,並預留充足時間進行測試,然後再進入下一階段。
「身份」到 SDK
當整合 SDK 的應用程式使用 registerAccountForMAM 註冊帳號時,SDK 會將 upn、aadId、tenantId 及權威 () 等所有參數儲存為身份。 然而,大多數 SDK 的身份 API 使用提供的 OID (,也稱為 Microsoft Entra ID 或 AAD ID) ,作為身份識別碼。 MAM SDK API 會回傳 OID 字串作為身份,並要求 OID 字串參數作為身份。 有些方法也可能接收或回傳 UPN 字串,此時 UPN 僅供參考。
單位參數不區分大小寫。 向 SDK 請求身份時,可能不會回傳註冊或設定身份時使用的相同套管。
注意
對於使用已棄用方法且會接收或回傳 UPN 字串的應用程式,應用程式必須確保傳遞給各種 API 呼叫的身份 UPN 字串是一致的。 傳遞不一致的 UPN 字串可能導致資料外洩。
受管理身份與非受管理身份
如同《 註冊應用程式保護政策》所述,您的應用程式負責在使用者登入時通知 SDK。 登入時,使用者帳號可能會被應用程式保護政策鎖定,也可能不會。 若帳號被應用保護政策鎖定,SDK 會視為已管理;否則,該項目為無管理。
SDK 將對其認為已管理的身份執行政策。 SDK 不會對它認為未受管理的身份執行政策。
目前,Intune App SDK 僅支援每個裝置單一的管理身份。 一旦 任何 整合 SDK 的應用程式註冊了受管理身份,所有隨後註冊的身份,即使目前正被應用程式保護政策鎖定,也會被視為未受管理身份。
如果裝置上已經註冊了一個受管理身份,且你的應用程式註冊了另一個同樣被應用保護政策鎖定的身份,SDK 會回傳 MAMEnrollmentManager.Result.WRONG_USER 並提示最終使用者提供修復選項。
詳情請參閱 「註冊以獲取 SDK 通知 」。
注意事項
註冊時未被針對應用程式保護政策的帳號,將被視為未受管理。 即使帳號未獲得授權或未被應用保護政策鎖定,SDK 也會定期檢查該帳號是否在日後成為授權並鎖定目標。 若未註冊其他受管理身份,SDK 會在該身份被政策鎖定後開始視為受管理身份。 使用者不需要登出再登入這個帳號來進行這項變更。
主動身份
你的應用程式必須隨時向 SDK 更新目前使用的身份,也就是所謂的主動身份。 如果有效身份被管理,SDK 會套用保護措施。 如果主動身份沒有被管理,SDK 就不會套用保護措施。
由於 SDK 沒有應用程式特定的知識,必須信任應用程式會共享正確的主動身份。
如果應用程式錯誤地告訴 SDK 非受管理身份在實際使用時仍處於有效狀態,SDK 將不會套用保護措施。 這可能導致資料外洩,危及使用者資料。
如果應用程式錯誤地告訴 SDK 受管理身份仍在使用,而非受管理身份卻仍在使用,SDK 將不當套用保護措施。 這不是資料外洩,但這可能不必要地限制未受管理的使用者,並使未受管理使用者的資料面臨被刪除的風險。
若您的應用程式顯示任何使用者資料,必須只顯示屬於該主動身份的資料。 如果您的應用程式目前還不知道顯示的資料擁有者,您可能需要先重構應用程式以提升身份認知,再開始整合多身份支援。
依身份組織應用程式資料
每當你的應用程式寫入新檔案時,SDK 會根據目前的活躍執行緒和程序身份,將 (也稱為「標籤」) 與該檔案關聯一個身份。 或者,你的應用程式也可以直接呼叫 SDK 手動標記檔案以特定身份 (詳情請參考「寫入受保護Files」) 。 SDK 使用這個標籤檔案身份來進行檔案加密和選擇性清除。
如果管理身份被加密政策鎖定,只有標註了該管理身份的檔案才會被加密。
如果管理員採取行動或設定政策要求清除受管理資料,只有標有受管理身份的檔案會被刪除。
SDK 無法將多個身份關聯到單一檔案。 如果你的應用程式在同一個檔案中儲存多位使用者的資料,SDK 的預設行為會導致這些資料保護不足或過度保護。 強烈建議你依照身份來組織應用程式的資料。
如果您的應用程式必須在同一檔案中儲存屬於不同身份的資料,SDK 提供在檔案中標記身份標記資料子集的功能。 詳情請參見 資料緩衝保護 。
實作多重身份
要宣告你的應用程式支援多身份,請先將以下中繼資料放入 AndroidManifest.xml。
<meta-data
android:name="com.microsoft.intune.mam.MAMMultiIdentity"
android:value="true" />
設定主動身份
您的應用程式可以將活躍身份設定為以下層級,優先順序由低至低:
- 執行緒層級
-
Context(一般)Activity等級 - 流程層級
執行緒層級的身份集合會取代該 Context 層級的身份集合,而該層級的身份集合又取代程序層級的身份集合。
在 a Context 上的恆等集合僅在適當的相關情境中使用。
例如,檔案 IO 操作就沒有關聯 Context的 。
最常見的是,應用程式會將身份設定 Context 為 Activity。
考慮將恆等式設 Context 於 Activity.onCreate。
應用程式 不得 顯示該身份的資料,除非該 Activity 身份設定為同一身份。
一般而言,程序層級身份只有在應用程式一次只處理單一身份時才有用。
這並非支援多帳號的應用程式的典型行為。
強烈建議你將帳號資料分開,並在執行串或 Context 層級中設定活躍身份。
如果你的應用程式使用上下文 Application 來取得系統服務,請確保執行緒或程序身份已設定,或你已在應用程式 Application 上下文中設定 UI 身份。
如果你的應用程式使用 Service 上下文來啟動意圖、使用內容解析器,或利用其他系統服務,務必在上下文 Service 中設定身份。
同樣地,如果你的應用程式使用JobService上下文執行這些動作,務必依實JobService作要求在上下文或執行緒中設定身份JobService。
例如,如果你 JobService 的程序工作是針對單一身份,考慮將該身份設定在 JobService 上下文中。
如果你 JobService 的程序是為多個身份設定作業,可以考慮在執行緒層級設定身份。
注意
使用 的 WorkManager 應用程式在設定身份時應特別謹慎。
具體來說,這些應用程式應避免在 Context 傳遞的 Worker 建構子上設定身份。
此 Context 實例可同時在多個 Worker 實例間共享。
為避免未定義行為,應用程式應依實Worker作要求設定執行緒身份Worker.doWork()。
注意事項
由於 用於 CLIPBOARD_SERVICE UI 操作,SDK 會使用 前景活動的 UI 身份來進行 ClipboardManager 操作。
MAMPolicyManager 中的以下方法可用於設定主動身份並取得先前設定的身份值。
public static void setUIPolicyIdentityOID(final Context context, final String oid,
final MAMSetUIIdentityCallback mamSetUIIdentityCallback, final EnumSet<IdentitySwitchOption> options);
public static String getUIPolicyIdentityOID(final Context context);
public static MAMIdentitySwitchResult setProcessIdentityOID(final String oid);
public static String getProcessIdentityOID();
public static MAMIdentitySwitchResult setCurrentThreadIdentityOID(final String oid);
public static String getCurrentThreadIdentityOID();
/**
* Get the current app policy. This does NOT take the UI (Context) identity into account.
* If the current operation has any context (e.g. an Activity) associated with it, use the overload below.
*/
public static AppPolicy getCurrentThreadPolicy();
/**
* Get the current app policy. This DOES take the UI (Context) identity into account.
* If the current operation has any context (e.g. an Activity) associated with it, use this function.
*/
public static AppPolicy getPolicy(final Context context);
public static AppPolicy getPolicyForIdentityOID(final String oid);
public static boolean getIsIdentityOIDManaged(final String oid);
為了方便,你也可以直接透過 MAMActivity 的方法設定活動的身份,而不是呼叫 MAMPolicyManager.setUIPolicyIdentityOID。
請使用以下方法:
public final void switchMAMIdentityOID(final String newIdentityOid, final EnumSet<IdentitySwitchOption> options);
注意事項
如果您的應用程式在清單中未宣告多身份支援,呼叫這些方法設定身份不會執行任何動作,且若回傳 , MAMIdentitySwitchResult則總是回傳 FAILED。
常見身份切換陷阱
對於呼叫
startActivity,Intune 應用程式 SDK 假設該層級的主動身份Context與所提供的Intent參數相關聯。 我們強烈建議將關卡身份設定Context為Activity的 的上下文,而非Application的上下文。建議在活動
onCreate方法中設定Context身份。 不過,也要確保涵蓋其他入門點,例如onNewIntent。 否則,當同一活動被重複用於同時顯示受管理與非受管理身份的資料時,政策可能會被錯誤套用,導致企業資料不受保護或個人資料受到不當限制。
身份切換結果
所有透過 MAMIdentitySwitchReport 來設定身份回報結果值的方法。 可回傳的值有四個:
| 傳回值 | 案例 |
|---|---|
SUCCEEDED |
身份變更成功。 |
NOT_ALLOWED |
身份變更是不被允許的。 如果嘗試將 UI () Context 身份設定,而當前執行緒中則設定不同的身份。 |
CANCELLED |
使用者通常透過按下 PIN 碼或驗證提示上的返回鍵來取消身份變更。 |
FAILED |
身份變更因不明原因失敗。 |
應用程式應該在顯示或使用受管理帳號資料前,先確認 MAMIdentitySwitchResult 是否存在 SUCCEEDED 。
大多數設定主動身份回傳的方法都是 MAMIdentitySwitchResult ,並同步。
若透過 setUIPolicyIdentityOID 設定Context身份,結果會以非同步方式報告。
應用程式可能會實作 MAMSetUIIdentityCallback 來接收此結果,或是對回調物件傳入 null。
如果在之前通話的結果ContextsetUIPolicyIdentityOID尚未送達時撥setUIPolicyIdentityOID出,新的回撥將取代舊的,原本的回撥永遠不會收到結果。
注意
如果 ContextsetUIPolicyIdentityOID 是 Activity,SDK 直到執行管理員設定的條件啟動檢查後,才知道身份變更是否成功。
這可能需要使用者輸入 PIN 碼或企業憑證。
目前,程序與執行緒身份切換器對於多身份啟用的應用程式總是能成功。 SDK 保留未來新增故障條件的權利。
UI 身份開關可能因參數無效、與執行緒身份衝突,或使用者取消條件啟動需求而失敗,例如按下 PIN 畫面的返回鍵 () 。
對於活動中失敗的 UI 身份切換,預設行為是完成該活動。
為了改變這種行為並接收活動身份變更嘗試的通知,你可以覆寫 中的 MAMActivity某個方法。
public void onSwitchMAMIdentityComplete(final MAMIdentitySwitchResult result);
如果你真的覆蓋 onSwitchMAMIdentityComplete (或呼叫 super 方法) , 必須 確保在身份切換失敗後,受管理帳號的資料不會被顯示。
注意事項
更換身份可能需要重新建立該活動。
在這種情況下, onSwitchMAMIdentityComplete 回調會傳送到該活動的新實例。
身份、意圖與身份切換選項
除了自動以主動身份標記新檔案外,SDK 也會以主動身份標記 意圖 。 預設情況下,SDK 會檢查收到的意圖的身份,並將其與主動身份進行比較。 若這些身份不匹配,SDK 通常會 (*) 請求身份切換 (詳見下方隱 含身份變更) 。
SDK 也會儲存這個進來的意圖身份,以便日後使用。 當應用程式明確更改 UI 身份時,SDK 會將應用程式嘗試切換的身份與最近收到的意圖身份進行比較。 如果這些身份不匹配,SDK 通常會 (*) 身份切換失敗。
SDK 進行此檢查是因為它假設應用程式仍顯示屬於意圖標籤身份的意圖內容。 此假設可防止應用程式在顯示受管理資料時不小心關閉保護;然而,這個假設可能不完全符合應用程式的實際行為。
可選的 IdentitySwitchOption 枚舉可傳遞給 setUIPolicyIdentityOID 與 switchMAMIdentityOID API,以修改 SDK 的預設行為。
IGNORE_INTENT: 在 UI 層請求身份交換時,此選項會通知 SDK 跳過將請求的身份參數與最近儲存的意圖身份進行比較。 當你的應用程式不再顯示屬於該身份的內容時,這很有用,而 SDK 不應該阻擋這種身份切換。 例如:- 你的應用程式是一個文件檢視器。 它可以渲染從其他應用程式傳入的文件。 它還包含一個功能,讓用戶可以切換帳號。 每當使用者使用此帳號切換功能時,應用程式會導向該帳號的專屬登陸頁面,內有該帳號的最新文件。
- 你的應用程式會收到顯示文件的意圖。 此意圖會被標記為管理身份。
- 你的應用程式會切換到受管理身份,並顯示這份文件,並且已正確套用保護措施。
- 使用者會使用帳號切換器切換到個人帳號。
你的應用程式必須在第 4 步更改 UI 身份。 在這種情況下,因為應用程式的行為是 (意圖) 文件中,應該會從
IGNORE_INTENT受管理帳號的資料中移動。 這樣可以避免 SDK 不當地失敗此呼叫。DATA_FROM_INTENT:當在 UI 層請求身份切換時,此選項會通知 SDK 最近儲存的意圖身份資料在 身份切換成功後仍會持續顯示。 因此,SDK 將根據先前的意圖身份完整評估接收政策,以判斷是否允許顯示該政策。 例如:- 你的應用程式是一個文件檢視器。 它可以渲染從其他應用程式傳入的文件。 它還包含一個功能,讓用戶可以切換帳號。 與前述不同,每當使用者使用此帳號切換功能時,應用程式會導覽至一個共享頁面,顯示 所有帳號的最新文件。
- 你的應用程式會收到顯示文件的意圖。 此意圖會被標記為管理身份。
- 你的應用程式會切換到受管理身份,並顯示這份文件,並且已正確套用保護措施。
- 使用者會使用帳號切換器切換到個人帳號。
你的應用程式必須在第 4 步更改 UI 身份。 在這種情況下,因為應用程式的行為是繼續顯示受管理身份的資料, (在意圖) 預覽文件,因此應該在
DATA_FROM_INTENT身份切換呼叫中使用。 這會通知 SDK 檢查已設定的應用程式保護政策,以判斷資料是否適合繼續顯示。
(*) SDK 的預設行為包含特殊外殼,若意圖來自同一應用程式內部或系統啟動器,則會跳過此資料輸入檢查。
清除主動身份
你的申請可能有些情境是帳戶無關的。 你的應用程式也可能有本地非管理情境,不需要登入。 在這兩種情況下,你的應用程式可能不希望 SDK 強制執行受管理身份的政策,但你可能沒有明確的身份可以切換。
你可以透過呼叫任意集合的恆等方法,並將恆等 OID 參數設為 null來清除主動身份。
在某一層清除身份後,SDK 會根據優先順序在其他層級尋找該身份。
或者,你可以將空字串作為身份 OID 參數傳遞,將身份設定為一個特殊的空值,並被視為未管理身份。 將主動身份設定為空字串,會告訴 SDK 不要強制執行 任何 應用程式保護政策。
隱性身份變更
上述章節說明應用程式能在執行緒、上下文和程序層級明確設定主動身份的不同方式。 不過,你的應用程式中的主動身份也可能在應用程式呼叫這些方法的情況下改變。 本節說明您的應用程式如何監聽並回應這些隱含的身份變更。
聆聽這些隱含的身份變化是可選的,但建議如此。 SDK 在不提供這些隱含的身份變更通知前,絕不會更改活躍身份。
注意
如果你的應用程式選擇不監聽隱含的身份變化,請特別小心不要假設主動身份。
有疑問時,使用 getCurrentThreadIdentityOID、 getUIPolicyIdentityOID和 getProcessIdentityOID 方法來確認主動身份。
隱性身份變更的來源
來自其他 Intune 管理應用程式的資料輸入,可能會改變執行緒層級和上下文層級的主動身份。
如果活動是由另一個 MAM 應用程式發送
Intent的,該活動的身份會根據該應用程式在傳送時Intent的活躍身份來設定。- 例如,當使用者選擇文件附件時,Microsoft Outlook 會啟動一個查看 Word 文件的活動。 Office 的文件檢視器活動的身份會切換到 Outlook 的身份。
對於服務而言,執行緒身份也會在 OR
onBind呼叫期間以類似onStart方式設定。 呼叫回Binder傳來源onBind也會暫時設定執行緒身份。對
ContentProvider遺囑的呼叫同樣會設定執行緒的身份,以維持其持續時間。
使用者與活動的互動可以在情境層級改變主動身份。 例如:
- 使用者在 期間
Resume取消授權提示,會導致隱含的身份切換到空身份。
- 使用者在 期間
處理隱含身份變更
你的應用程式可以選擇性地監聽並回應這些隱含的身份變更。 例如,你的應用程式可能需要多個步驟才能啟用新增帳號,例如電子郵件應用程式設置新收件匣。 當你發現使用者嘗試切換身份到這個不完整帳號的身份時,應用程式的處理器可以在接受身份交換前,將使用者導向到帳號設定活動。 或者,你的應用程式處理器可以顯示錯誤對話框並封鎖身份切換。
你的應用程式可以在或 或 實作 MAMIdentityRequirementListener 介面ServiceContextProvider,用於此執行緒的身份變更。 你的實作必須覆蓋:
public abstract void onMAMIdentitySwitchRequired(String upn, String oid,
AppIdentitySwitchResultCallback callback);
你的應用程式可以在 a Activity 上實作 MAMActivityIdentityRequirementListener 介面,用於此活動的身份變更。
你的實作必須覆蓋:
public abstract void onMAMIdentitySwitchRequired(String upn, String oid,
AppIdentitySwitchReason reason,
AppIdentitySwitchResultCallback callback);
AppIdentitySwitchReason列舉參數描述隱含身份切換的來源。
| 枚舉值 | 預設 SDK 行為 | 描述 |
|---|---|---|
CREATE |
允許身份切換。 | 身份切換是因為活動的創造而發生。 |
NEW_INTENT |
允許身份切換。 | 身份切換發生是因為某項活動被賦予新的意圖。 |
RESUME_CANCELLED |
封鎖身份交換。 | 身份切換是因為恢復被取消。 這種情況最常見於終端使用者按下 PIN 鍵、認證或合規介面的返回鍵。 |
AppIdentitySwitchResultCallback 參數允許開發者覆寫身份交換器的預設行為:
public interface AppIdentitySwitchResultCallback {
/**
* @param result
* whether the identity switch can proceed.
*/
void reportIdentitySwitchResult(AppIdentitySwitchResult result);
}
// Where [AppIdentitySwitchResult] is either `SUCCESS` or `FAILURE`.
onMAMIdentitySwitchRequired 是所有隱含身份變更的呼叫,唯獨不包括透過從 返回的 MAMService.onMAMBindBinder 所做的變更。
立即呼叫的 onMAMIdentitySwitchRequired 預設實作:
callback.reportIdentitySwitchResult(FAILURE)當原因為RESUME_CANCELLED時。callback.reportIdentitySwitchResult(SUCCESS)其他情況。
大多數應用程式不預期會以不同方式阻擋或延遲身份切換,但若應用程式需要這麼做,以下幾點必須考慮:
如果身份切換被封鎖,最終使用者的行為與 SDK 的「從其他應用程式接收資料」應用程式保護設定禁止資料輸入相同。
如果服務正在主執行緒
reportIdentitySwitchResult上執行,必須同步呼叫,否則 UI 執行緒將停止回應。在建立時
Activity, onMAMIdentitySwitchRequired 會在 之前被呼叫onMAMCreate。 如果應用程式必須顯示 UI 來決定是否允許身份切換,那該 UI 必須用 不同的 活動來顯示。在
Activity中,當請求切換到空身份且理由為RESUME_CANCELLED時,應用程式必須修改恢復的活動,以顯示與該身份交換器一致的資料。 若無法執行,應用程式應拒絕切換,使用者將再次被要求遵守恢復身份 (政策,例如顯示應用程式 PIN 輸入畫面) 。
注意
多身份應用程式可以接收來自受管理與非受管理應用程式的傳入資料。 應用程式有責任以受管理方式處理來自受管理身份的資料。
如果請求的身份被管理 (使用 MAMPolicyManager.getIsIdentityOIDManaged 來檢查) ,但應用程式無法使用該帳戶,例如 (,因為像電子郵件帳戶這類帳號必須先在應用程式中設定,) 身份切換才應該被拒絕。
可透過呼叫靜態方法MAMActivity.defaultOnMAMIdentitySwitchRequired(activity, upn, oid, reason, callback)來存取 的MAMActivity.onMAMIdentitySwitchRequired預設行為。
同樣地,如果你需要覆寫 MAMActivity.onSwitchMAMIdentityComplete,也可以實作MAMActivityIdentitySwitchListener而不明確繼承 。MAMActivity
身份切換與截圖限制
Intune App SDK 利用這個Window旗標FLAG_SECURE來強制執行截圖政策。
有些應用程式也可能設定 FLAG_SECURE 為各自用途。
當應用程式保護政策不限制截圖時,SDK 就不會修改 FLAG_SECURE。
當身份從政策要求停用截圖的身份切換到不需要停用政策的身份時,SDK 會清除 FLAG_SECURE。
因此,你的應用程式不應該依賴 FLAG_SECURE 身份切換後仍保持設定。
非同步操作中的身份保存
應用程式經常會從 UI 執行緒派遣背景任務,讓其他執行緒的操作。 多身份應用程式必須確保這些背景任務能以適當的身份運作,而該身份通常與派遣它們的活動相同。
Intune 應用程式 SDK 提供 MAMAsyncTask 與 MAMIdentityExecutors,方便在非同步操作中保存身份。 ) (若非同步操作能:
- 將屬於受管理身份的資料寫入檔案
- 與其他應用程式溝通
MAMAsyncTask
使用MAMAsyncTask時,只需繼承 AsyncTask 和 ,分別將 和 的覆蓋doInBackgroundonPreExecute替換為 doInBackgroundMAM 和 onPreExecuteMAM 。
MAMAsyncTask建構子會取一個活動上下文。
例如:
AsyncTask<Object, Object, Object> task = new MAMAsyncTask<Object, Object, Object>(thisActivity) {
@Override
protected Object doInBackgroundMAM(final Object[] params) {
// Do operations.
}
@Override
protected void onPreExecuteMAM() {
// Do setup.
};
}
MAMAsyncTask 會根據正常的優先順序採取主動身份。
MAMIdentityExecutors
MAMIdentityExecutors允許你用 和 方法包裝現有Executor或ExecutorService實例作為身份保ExecutorExecutorService/wrapExecutor全。wrapExecutorService 例如
Executor wrappedExecutor = MAMIdentityExecutors.wrapExecutor(originalExecutor, activity);
ExecutorService wrappedService = MAMIdentityExecutors.wrapExecutorService(originalExecutorService, activity);
MAMIdentityExecutors 會根據正常的優先順序採取主動身份。
檔案保護
寫作受保護Files
如前述「依身份組織應用程式資料」中所述,Intune App SDK 會將從執行緒/程序層級) 的主動身份 (與撰寫時的檔案關聯起來。 在檔案建立時設定正確的身份至關重要,以確保加密與選擇性清除功能。
你的應用程式可能會使用 MAMFileProtectionManager 類別查詢或更改檔案的身份,專門 MAMFileProtectionManager.getProtectionInfo 用於查詢和 MAMFileProtectionManager.protectForOID 變更。
此 protectForOID 方法也可用於保護目錄。
目錄保護會以遞迴方式套用於目錄中所有檔案和子目錄。
當目錄被保護時,所有在該目錄內新建立的檔案都會自動套用相同的保護。
由於目錄保護是遞迴套用,對於大型目錄, protectForOID 呼叫可能需要一些時間才能完成。
因此,對於包含大量檔案的目錄進行保護的應用程式,可能會希望在背景執行緒中非同步執行 protectForOID 。
protectForOID用空字串呼叫身份參數,會將檔案/目錄標記為非管理身份。
此操作會移除先前加密的檔案/目錄中的加密。
當發出選擇性清除指令時,檔案/目錄不會被刪除。
警告
確保只有屬於特定身份的檔案才能受到該身份保護非常重要。 否則,當擁有者身份登出時,其他身份可能會遭受資料遺失,因為檔案會被清除,加密金鑰存取也會喪失。
顯示受保護檔案內容
同時,在 顯示 檔案內容時設定正確的身份也至關重要,以防止未經授權的使用者瀏覽受管理資料。
SDK 無法自動推斷被讀取檔案與資料顯示 Activity之間的關係。
應用程式 必須 在顯示任何受管理資料前,先適當設定 UI 身份。
這包括從檔案讀取的資料。
若檔案來自應用程式外部 (ContentProvider 來自公開可寫入的位址) ,應用程式 必須 嘗試使用正確的 MAMFileProtectionManager.getProtectionInfo 過載資料來源) (來判斷檔案身份,才能顯示從檔案讀取的資訊。
若 getProtectionInfo 回報非空、非空身份,應用程式 必須 使用 MAMActivity.switchMAMIdentityOID 或 MAMPolicyManager.setUIPolicyIdentityOID 來設定 UI 身份與此身份相符。
若身份切換失敗, 檔案資料不得 顯示。
讀取內容 URI 時,可能需要先透過過載讀取 Uri) 讀取身份 (getProtectionInfo,然後適當設定上下文或執行緒身份。
此操作必須在開啟檔案描述符或輸入串流前 ContentResolver完成,否則操作可能會失敗。
一個範例流程可能如下:
使用者選擇一個文件在應用程式中開啟。
在開啟流程中,讀取磁碟資料前,應用程式會確認應該使用的身份來顯示內容:
MAMFileProtectionInfo info = MAMFileProtectionManager.getProtectionInfo(docPath) if (info != null) MAMPolicyManager.setUIPolicyIdentityOID(activity, info.getIdentityOID(), callback, EnumSet.noneOf<IdentitySwitchOption.class>)應用程式會等到結果被回報後再回撥。
如果回報結果是失敗,應用程式就不會顯示該文件。
應用程式會開啟並渲染檔案。
若應用程式使用 Android DownloadManager 下載檔案,SDK 將嘗試以 先前描述的身份優先權自動保護這些檔案。
當執行緒身份未設定時,將使用用於擷取 的 DownloadManager 上下文。
若下載的檔案包含企業資料,應用程式需負責在檔案被移動或重新建立時呼叫 protectForOID 。
Single-Identity 多身份轉換
如果先前推出的單一身份 Intune 整合應用程式,後來整合多重身份,先前安裝的應用程式將會經歷轉換。 這個轉換對使用者來說是看不到的。
應用程式 並非必須 處理此轉換。 所有在轉換前建立的檔案都會繼續被視為受管理 (,所以如果有加密政策) ,檔案會保持加密狀態。
如果你不希望所有先前的應用程式資料都與管理身份綁定,你可以偵測這個轉換並明確移除保護。
- 透過比較你的應用程式版本與已知新增多重身份支援的版本來偵測升級。
- 對於不希望與管理身份關聯的檔案或目錄,請
protectForOID用空字串呼叫身份參數。
離線劇本
當公司入口網站應用程式未安裝時,Intune App SDK 會以「離線」模式運行。 檔案識別標籤對離線模式敏感:
如果公司入口網站沒有安裝,檔案就無法被標記身份標籤。 在離線模式下呼叫 MAMFileProtectionManager.protectForOID 是安全的,但不會有效果。
如果公司入口網站已安裝,但應用程式沒有應用程式保護政策,檔案就無法可靠地被標註身份標籤。
當檔案身份標籤啟用時,所有先前建立的檔案都被視為屬於空字串身份) 的個人/未管理 (,除非該應用程式先前安裝為單一身份管理應用程式,如單一 身份到多身份轉換中所述。
為避免此類情況,應用程式應避免建立包含帳號資料的檔案,直到帳號註冊成功完成。 如果你的應用程式必須在離線時建立檔案,它可以在 SDK 上線後使用 MAMFileProtectionManager.protectForOID 來修正檔案的相關身份。
資料緩衝區保護
警告
不建議將多個帳號的資料寫入單一檔案。 如果可能,請依照身份整理你的應用程式檔案。
SDK 的 MAMDataProtectionManager 提供檢查及變更特定資料緩衝區標籤身份的方法,格式為 byte[] or InputStream 或。
MAMDataProtectionManager.protectForOID 允許應用程式將資料與身份關聯,若該身份目前正被加密政策鎖定,則對資料進行加密。
這些加密資料適合以檔案形式儲存到磁碟。
MAMDataProtectionManager 同時也能查詢與身份相關的資料並解密。
使用該功能的 MAMDataProtectionManager 應用程式應該自動設定 MANAGEMENT_REMOVED 接收通知。 詳情請參閱 「註冊以獲取 SDK 通知 」。
此通知完成後,若在保護緩衝區) 啟用檔案加密,則透過此類別保護的緩衝區將不再可讀取 (。
應用程式可以在處理MANAGEMENT_REMOVED通知時呼叫MAMDataProtectionManager.unprotect所有緩衝區,防止這些緩衝區無法讀取。
若您希望保留身份資訊,在此通知期間致電也是安全的 protectForOID 。
加密在通知期間一定會被禁用,呼叫 protectForOID 處理器也不會加密資料緩衝區。
警告
應避免在應用程式初期進行加密操作。 SDK 會在應用程式啟動後盡快非同步執行加密初始化。 然而,若應用程式在啟動時提出加密請求,可能會被封鎖,直到加密初始化完成。
注意事項
Intune App SDK 加密 API 應僅用於依照 Intune 政策要求加密資料。 對於未啟用加密政策的帳戶則不會受到保護,因此無法作為通用加密函式庫使用。
內容提供者
多身份應用程式也必須保護透過 ContentProviders 分享的資料,以防止不當分享受管理內容。
你的應用程式必須先呼叫靜態 的 MAMContentProvider 方法 isProvideContentAllowedForOid(provider, oid) ,才能回傳內容。
若此函式回傳 false,則 該內容不得 返回呼叫者。
如果你ContentProvider要退貨ParcelFileDescriptor,就不需要打電話isProvideContentAllowedForOid。
透過內容提供者回傳的檔案描述符會根據檔案身份自動處理。
選擇性擦除
預設情況下,Intune App SDK 會自動處理選擇性清除,刪除所有與管理身份相關聯的檔案。 之後,SDK 會優雅地關閉應用程式,完成活動並終止應用程式流程。
SDK 提供應用程式可選的功能,可以補充 (推薦的) ,或覆蓋預設的清除行為。
SDK 的預設清除處理程序不處理由 保護的資料 MAMDataProtectionManager緩衝區。
如果你的應用程式使用此功能, 必須 補充或覆寫預設的清除處理程序來移除該資料。
注意事項
補充並覆寫預設的清除行為需要處理特定的 SDK 通知。 欲了解更多通知處理程式實作的詳細說明,請參閱 SDK 通知註冊 。
補充預設清除行為
為了補充預設的 SDK 清除行為,你的應用程式可以註冊 WIPE_USER_AUXILIARY_DATAMAMNotificationType。
SDK 會在執行預設選擇性清除 前 發送此通知。 SDK 會等你的應用程式通知處理程式完成後,才刪除資料並終止應用程式。 你的應用程式應該會同步清除資料,直到所有清理完成才會回傳。
應用程式應強烈考慮在預設清除行為中加入 WIPE_USER_AUXILIARY_DATA,因為多身份應用程式常見的應用程式專屬清理。
覆寫預設清除行為
要覆蓋預設的 SDK 清除行為,你的應用程式可以註冊 WIPE_USER_DATAMAMNotificationType。
警告
應用程式絕不可以同時 WIPE_USER_DATA 註冊 和 WIPE_USER_AUXILIARY_DATA。
覆寫預設的 SDK 清除行為會對你的應用程式造成相當大的風險。 您的應用程式將完全負責移除所有與管理身份相關的資料,包括所有已標記該身份的資料緩衝區。
- 如果受管理身份有加密保護,且你的應用程式自訂清除處理程式沒有完全移除所有受管理資料,剩餘的受管理檔案仍會保持加密狀態。 這些資料將變得無法存取,且你的應用程式可能無法優雅地嘗試讀取加密資料。
- 你的應用程式清除處理程式可能會讓未受管理的使用者遺失資料,因為它移除了沒有被管理身份標記的檔案。
如果您的應用程式自訂清除處理程式從檔案中移除受管理資料,但希望保留其他資料, 必須 透過 MAMFileProtectionManager.protectForOID (更改檔案身份,) 為非管理身份或空字串。
你被覆寫的清除處理程序應該會同步清除資料,直到所有清理完成才會回來。
建議在完成自訂清除處理步驟後手動關閉應用程式,以防止使用者在清除後存取記憶體資料。
退出標準
請計劃投入大量時間驗證你的應用程式整合多重身份。 在開始測試前:
- 建立並指派應用程式保護政策給帳號。 這將是你的測試管理帳號。
- 建立但不要將應用程式保護政策指派給另一個帳號。 這將是你的測試非管理帳戶。 或者,如果你的應用程式支援 Microsoft Entra 以外的多種帳號類型,你可以使用一個非 Entra 的現有帳號作為非管理的測試帳號。
- 重新熟悉你在應用程式中政策的執行方式。 多重身份測試要求你能輕易區分應用程式是否在執行政策下運作。 應用程式保護政策設定能阻擋截圖,能快速測試政策執行。
- 請考慮你應用程式所提供的整套 UI 集合。 列舉顯示帳號資料的畫面。 你的應用程式是一次只顯示單一帳號的資料,還是可以同時呈現多個帳號的資料?
- 考慮你應用程式所建立的整套檔案。 列舉哪些檔案包含屬於帳戶的資料,而非系統層級的資料。
- 決定你要如何驗證這些檔案的加密。
- 考慮你的應用程式與其他應用程式互動的整套方式。 列出所有進出口點。 你的應用程式可以接收哪些類型的資料? 它傳達的意圖是什麼? 它實施了哪些內容提供者?
- 決定你將如何運用這些資料共享功能。
- 準備一台測試裝置,同時包含可與非管理應用程式互動。
- 請考慮你的應用程式如何讓終端使用者與所有登入帳號互動。 使用者是否需要在該帳號資料顯示前手動切換到該帳號?
當你徹底評估應用程式目前的行為後,請執行以下一組測試來驗證多身份整合。 請注意,這並非一份完整的清單,也不保證你的應用程式多重身份實作完全沒有錯誤。
驗證登入與登出情境
你的多重身份應用程式最多支援一個受管理帳號和多個非受管理帳號。 這些測試有助於確保你的多重身份整合在使用者登入或登出時不會錯誤更改保護措施。
進行這些測試時,請安裝您的應用程式和 Intune 公司入口網站;開始測試前請勿登入。
| 案例 | 步驟 |
|---|---|
| 先管理登入 | - 先以受管理帳號登入,並驗證該帳號的資料是否被管理。 - 以未管理帳號登入,確認該帳號的資料未被管理。 |
| 先非管理登入 | - 先用未管理帳號登入,並確認該帳號的資料未被管理。 - 以受管理帳號登入,並驗證該帳號的資料是否受管理。 |
| 登入 多重管理 | - 先以受管理帳號登入,並驗證該帳號的資料是否被管理。 - 以第二個受管理帳號登入,並驗證使用者在未先移除原始受管理帳號前被封鎖登入。 |
| 登出已管理 | - 用管理帳號和非管理帳號登入你的應用程式。 - 登出管理帳號。 - 確認該受管理帳號已從您的應用程式中移除,且該帳號的所有資料都已被移除。 - 確認該未管理帳戶仍然登入,且未移除任何資料,且政策仍未套用。 |
| 未管理登出 | - 用管理帳號和非管理帳號登入你的應用程式。 - 登出未管理帳號。 - 確認未管理帳號已從您的應用程式中移除,且該帳號的所有資料都已被移除。 - 確認受管理帳號仍登入、未管理帳號的資料未被移除,且政策仍在執行。 |
驗證主動身份與應用程式生命週期
你的多重身份應用程式可能會顯示單一帳號的資料檢視,並允許使用者明確更改目前正在使用的帳號。 它也可能同時呈現多個帳號資料的視圖。 這些測試有助於確保您的多重身份整合在整個應用程式生命週期中,為每個頁面的主動身份提供適當的保護。
進行這些測試時,請安裝您的應用程式和 Intune 公司入口網站;開始測試前,請同時使用受管理與非受管理帳號登入。
| 案例 | 步驟 |
|---|---|
| 單一帳號視圖,管理式 | - 切換到管理帳號。 - 瀏覽應用程式中所有顯示單一帳號資料的頁面。 - 確認每頁都有執行政策。 |
| 單一帳戶檢視,未管理 | - 切換到非管理帳戶。 - 瀏覽應用程式中所有顯示單一帳號資料的頁面。 - 確認該政策未在任何頁面被執行。 |
| 多帳號視角 | - 瀏覽應用程式中所有同時呈現多個帳號資料的頁面。 - 確認每頁都有執行政策。 |
| 有意識的停頓 | - 在顯示受管理資料且政策啟用的畫面上,透過切換至裝置主畫面或其他應用程式暫停應用程式。 - 繼續應用程式。 - 確認政策仍然適用。 |
| 未受控的暫停 | - 在顯示未管理資料且沒有啟用政策的畫面上,請透過切換至裝置主畫面或其他應用程式暫停應用程式。 - 繼續應用程式。 - 確認政策未被執行。 |
| 成功擊殺 | - 在顯示受管理資料且政策啟動的畫面上,強制關閉該應用程式。 - 重新啟動應用程式。 - 確認若應用程式在管理帳號資料 (預期) 的畫面恢復,政策仍然適用。 如果應用程式在顯示未管理帳戶資料的畫面上恢復,請確認該政策沒有被套用。 |
| 未管理的殺戮 | - 在顯示未管理資料且政策啟動的畫面上,強制終止應用程式。 - 重新啟動應用程式。 - 確認若應用程式在未管理帳戶資料 (預期) 畫面恢復,則政策未被套用。 如果應用程式在顯示受管理帳號資料的畫面上恢復,請確認該政策仍然適用。 |
| 身份切換臨時 | - 嘗試在帳號間切換,並暫停/繼續/關閉/重啟應用程式。 - 確認受管理帳戶的資料始終受到保護,而非管理帳戶的資料從未受到保護。 |
驗證資料共享情境
你的多重身份應用程式可能會傳送資料到其他應用程式,也可能會接收資料。 Intune 的應用程式保護政策有設定會規範這種行為。 這些測試有助於確保您的多重身份整合符合這些資料共享設定。
進行這些測試時,請安裝您的應用程式和 Intune 公司入口網站;開始測試前,請同時使用受管理與非受管理帳號登入。 此外:
- 管理帳戶的政策設定為:
- 「將組織資料傳送到其他應用程式」到「政策管理應用程式」。
- 「從其他應用程式接收資料」到「政策管理應用程式」。
- 在測試裝置上安裝其他應用程式:
- 一個受控應用程式,目標設定與你的應用程式相同政策,能像 Outlook) 一樣傳送和接收資料 (Microsoft。
- 任何能傳送和接收資料的非管理應用程式。
- 用受管理的測試帳號登入另一個受管理的應用程式。 即使另一個受管理的應用程式是多重身份,也只能用受管理帳號登入。
如果你的應用程式能將資料傳送到其他應用程式,例如 Microsoft Outlook 將文件附件傳送到 Microsoft Office:
| 案例 | 步驟 |
|---|---|
| 受管理身份發送至非受管理應用程式 | - 切換到管理帳號。 - 導航到應用程式可以傳送資料的位置。 - 嘗試將資料傳送到未受管理的應用程式。 - 你應該被封鎖,不能把資料傳送到未受管理的應用程式。 |
| Managed identity send to managed app | - 切換到管理帳號。 - 導航到應用程式可以傳送資料的位置。 - 嘗試將資料傳送到另一個已登入的受管理帳號應用程式。 - 你應該可以把資料傳送到受管理的應用程式。 |
| Unmanaged identity send to managed app | - 切換到非管理帳戶。 - 導航到應用程式可以傳送資料的位置。 - 嘗試將資料傳送到另一個已登入的受管理帳號應用程式。 - 你應該被阻止傳送資料到另一個受管理的應用程式。 |
| Unmanaged identity send to unmanaged app | - 切換到非管理帳戶。 - 導航到應用程式可以傳送資料的位置。 - 嘗試將資料傳送到未受管理的應用程式。 - 你應該隨時被允許將未受管理帳號的資料傳送到未受管理的應用程式。 |
你的應用程式可能會主動從其他應用程式匯入資料,例如 Microsoft Outlook 附上 Microsoft OneDrive 的檔案。 你的應用程式也可能被動接收來自其他應用程式的資料,例如Microsoft Office從Microsoft Outlook附件開啟文件。 接收應用程式保護政策設定涵蓋了兩種情況。
如果你的應用程式能主動從其他應用程式匯入資料:
| 案例 | 步驟 |
|---|---|
| 從非管理應用程式匯入管理身份 | - 切換到管理帳號。 - 導航到您的應用程式可從其他應用程式匯入資料的地方。 - 嘗試從未受管理的應用程式匯入資料。 - 你應該被封鎖,無法匯入未管理應用程式的資料。 |
| 從 managed app 匯入 Managed identity | - 切換到管理帳號。 - 導航到您的應用程式可從其他應用程式匯入資料的地方。 - 嘗試從另一個受管理應用程式匯入資料,並登入受管理帳號。 - 你應該可以從另一個受管理的應用程式匯入資料。 |
| Unmanaged identity 從 managed app 匯入 | - 切換到非管理帳戶。 - 導航到您的應用程式可從其他應用程式匯入資料的地方。 - 嘗試從另一個受管理應用程式匯入資料,並登入受管理帳號。 - 你應該被阻止從另一個受管理應用程式匯入資料。 |
| Unmanaged identity import from unmanaged app | - 切換到非管理帳戶。 - 導航到您的應用程式可從其他應用程式匯入資料的地方。 - 嘗試從未受管理的應用程式匯入資料。 - 你應該永遠被允許從未管理的應用程式匯入資料,針對未受管理的帳戶。 |
如果你的應用程式能被動接收來自其他應用程式的資料:
| 案例 | 步驟 |
|---|---|
| 受管理身份從未管理的應用程式接收 | - 切換到管理帳號。 - 切換到非管理應用程式。 - 導航到可以傳送資料的地方。 - 嘗試將資料從未管理的應用程式傳送到你的應用程式。 - 你的應用程式的託管帳號不應該能從未受管理的應用程式接收資料。 |
| 受管理身份從受管理應用程式接收 | - 切換到管理帳號。 - 切換到另一個已登入受管理帳號的應用程式。 - 導航到可以傳送資料的地方。 - 嘗試將資料從受管理的應用程式傳送到你的應用程式。 - 你的應用程式的受管理帳號應該被允許接收來自另一個受管理應用程式的資料。 |
| 非管理身份從受管理應用程式接收 | - 切換到非管理帳戶。 - 切換到另一個已登入受管理帳號的應用程式。 - 導航到可以傳送資料的地方。 - 嘗試將資料從受管理的應用程式傳送到你的應用程式。 - 你的應用程式的非管理帳號不應該能從該管理應用程式接收資料。 |
| 非管理身份來自未管理應用程式 | - 切換到非管理帳戶。 - 切換到非管理應用程式。 - 導航到可以傳送資料的地方。 - 嘗試將資料從未管理的應用程式傳送到你的應用程式。 - 你的應用程式的非管理帳戶應該始終被允許接收該非管理應用程式的資料。 |
這些測試失敗可能表示你的應用程式在嘗試傳送或接收資料時,沒有設定正確的主動身份。 你可以利用 SDK 在發送/接收時的取得身份 API,確認有效身份是否正確設定來調查。
驗證選擇性清除情境
你的多重身份應用程式可能已經補充或覆蓋了 SDK 預設的清除行為。 這些測試有助於確保您的多重身份整合在清除啟動時正確移除受管理資料,且不影響未受管理的資料。
警告
提醒你,如果你的應用程式已經 利用 MAMDataProtectionManager.protectForOID,必須為 或 實作一個處理WIPE_USER_AUXILIARY_DATAWIPE_USER_DATA程序。
進行這些測試時,請安裝您的應用程式和 Intune 公司入口網站;開始測試前,請同時使用受管理與非受管理帳號登入。 兩個帳號都有運動應用程式的情境,儲存帳號資料。
| 案例 | 前提條件 | 步驟 |
|---|---|---|
| 輔助擦拭處理器 | 你的應用程式已經實作了一個處理器 WIPE_USER_AUXILIARY_DATA |
-
從 Microsoft Intune 管理中心執行選擇性清除。 - 通常透過日誌) 確認 (你的清除處理程序已成功執行。 - 確認該受管理帳號已從您的應用程式中移除,且該帳號的所有資料都已被移除。 - 確認該未管理帳戶仍然登入,且未移除任何資料,且政策仍未套用。 |
| 覆寫的擦除處理器 | 你的應用程式已經實作了一個處理器 WIPE_USER_DATA |
-
從 Microsoft Intune 管理中心執行選擇性清除。 - 通常透過日誌) 確認 (你的清除處理程序已成功執行。 - 確認該受管理帳號已從您的應用程式中移除,且該帳號的所有資料都已被移除。 - 確認該未管理帳戶仍然登入,且未移除任何資料,且政策仍未套用。 - 確認你的應用程式在清除處理程序完成後是否已優雅地退出,或仍處於健康狀態。 |
| 手動檔案保護 | - 你的應用程式呼叫 MAMFileProtectionManager.protectForOID - 你的應用程式實作了一個處理器 WIPE_USER_DATA |
- 確保你有模擬情境,讓你的應用程式手動保護至少一個屬於受管理帳號的檔案。 - 從 Microsoft Intune 管理中心執行選擇性清除。 - 確認檔案已被移除。 |
| 手動資料緩衝區保護 | - 你的應用程式呼叫 MAMDataProtectionManager.protectForOID - 你的應用程式實作了處理程序,針對其中之一 WIPE_USER_AUXILIARY_DATA 或 WIPE_USER_DATA |
- 確保你有模擬情境,讓你的應用程式手動保護至少一個屬於受管理帳號的資料緩衝區。 - 從 Microsoft Intune 管理中心執行選擇性清除。 - 確認資料緩衝區已從儲存檔案中移除,且你的應用程式仍能讀取這些檔案中的未管理資料。 |
後續步驟
完成上述所有 退出條件 後,您的應用程式將成功整合為多重身份,並能依身份執行應用程式保護政策。 後續章節,第六階段:應用程式組態與第七階段:應用程式參與功能,可能必須或不需,取決於你應用程式所需的應用程式保護政策支援。 如果你不確定這些章節是否適用於你的應用程式,請重新檢視 SDK 整合的關鍵決策。