iOS용 Intune 앱 SDK - 앱 보호 CA 지원(선택 사항)

앱 보호 조건부 액세스는 Intune에서 앱 보호 정책이 적용되었음을 확인할 때까지 서버 토큰에 대한 액세스를 차단합니다. 이 기능을 사용하려면 사용자 추가 흐름을 변경해야 합니다. 고객이 App Protection CA를 사용하도록 설정하면 보호된 리소스에 액세스하는 해당 고객 테넌트의 애플리케이션은 이 기능을 지원하지 않는 한 액세스 토큰을 획득할 수 없습니다.

참고

이 가이드는 여러 단계로 나뉩니다. 먼저 1단계: 통합 계획을 검토합니다.

6단계: 앱 보호 CA 지원

스테이지 목표

  • iOS 앱 내에서 앱 보호 조건부 액세스를 지원하는 데 사용할 수 있는 다양한 API에 대해 알아봅니다.
  • 앱 보호 통합 앱 및 사용자에 대한 조건부 액세스입니다.
  • 앱 및 사용자와 위의 통합을 테스트합니다.

의존 관계

Intune SDK 외에도 앱에서 앱 보호 CA를 활성화하려면 이러한 두 구성 요소가 필요합니다.

  1. iOS 인증자 앱
  2. MSAL 인증 라이브러리 1.0 이상

MAM-CA 수정 흐름

MAM-CA 수정 흐름 다이어그램.

MAM 규정 준수 프로세스 흐름

MAM 규정 준수 프로세스 흐름 다이어그램.

새 API

대부분의 새 API는 IntuneMAMComplianceManager.h에서 찾을 수 있습니다. 앱은 아래에 설명된 동작의 세 가지 차이점을 알고 있어야 합니다.

새 동작 설명
앱 → ADAL/MSAL: 토큰 획득 응용 프로그램이 토큰을 획득하려고 할 때 ERROR_SERVER_PROTECTION_POLICY_REQUIRED를 받을 준비가 되어 있어야 합니다. 앱은 초기 계정 추가 흐름 중에 또는 나중에 응용 프로그램 수명 주기에서 토큰에 액세스할 때 이 오류를 수신할 수 있습니다. 앱에 이 오류가 발생하면 액세스 토큰이 부여되지 않으므로 서버 데이터를 검색하려면 수정해야 합니다.
App → Intune SDK: remediateComplianceForIdentity 호출 앱이 ADAL로부터 ERROR_SERVER_PROTECTION_POLICY_REQUIRED를 받거나 MSAL에서 MSALErrorServerProtectionPoliciesRequired를 받으면 [[IntuneMAMComplianceManager instance] remediateComplianceForIdentity]를 호출하여 Intune 앱을 등록하고 정책을 적용할 수 있도록 해야 합니다. 이 호출 중에 앱이 다시 시작될 수 있습니다. 앱을 다시 시작하기 전에 상태를 저장해야 하는 경우 IntuneMAMPolicyDelegate의 restartApplication 대리자 메서드에서 수행할 수 있습니다.

remediateComplianceForIdentity는 registerAndEnrollAccount 및 loginAndEnrollAccount의 모든 기능을 제공합니다. 따라서 앱은 이러한 이전 API 중 하나를 사용할 필요가 없습니다.
Intune → 앱: 위임 수정 알림 Intune은 정책을 검색하고 적용한 후 IntuneMAMComplianceDelegate 프로토콜을 사용하여 앱에 결과를 알립니다. 앱에서 각 오류를 처리하는 방법에 대한 자세한 내용은 IntuneComplianceManager.h의 IntuneMAMComplianceStatus를 참조하세요. IntuneMAMComplianceCompliant를 제외한 모든 경우에 사용자에게 유효한 액세스 토큰이 없습니다.

앱에 이미 관리 콘텐츠가 있고 호환 상태로 들어갈 수 없는 경우 애플리케이션은 선택적 삭제를 호출하여 회사 콘텐츠를 제거해야 합니다.

호환 상태에 도달할 수 없는 경우 앱은 withErrorMessage 및 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를 가져오려면 다음 단계를 수행해야 합니다.

  • 먼저 앱에 ERROR_SERVER_PROTECTION_POLICY_REQUIRED 보고할 때 MSAL에서 다시 전송하는 MSALError 개체 내의 userInfo[MSALHomeAccountIdKey]에서 homeAccountId를 가져옵니다.
  • 이 homeAccountId는 ObjectId.TenantId 형식입니다. '.'에서 문자열을 분할하여 ObjectId 값을 추출한 다음 수정 API remediateComplianceForAccountId에서 accountId 매개 변수에 해당 값을 사용합니다.

종료 조건

App Protection CA에 대한 테스트 사용자 구성

  1. 관리자 자격 증명을 사용하여 에 로그인합니다.https://portal.azure.com
  2. Microsoft Entra ID>조건부 액세스를> 선택하고새 정책을 만듭니다. 새 조건부 액세스 정책을 만듭니다.
  3. 다음 항목을 설정하여 조건부 액세스 정책을 구성합니다.
    • 이름 필드에 채우기.
    • 정책 활성화.
    • 사용자 또는 그룹에 정책 할당
  4. 클라우드 앱을 할당합니다. 모든 클라우드 앱포함을> 선택합니다. 경고에 나와 있듯이 이 설정을 잘못 구성하지 않도록 주의하세요. 예를 들어 모든 클라우드 앱을 제외하면 콘솔에서 자신을 잠글 수 있습니다.
  5. 액세스 제어>를 선택하여 액세스 제어 권한부여 액세스> 권한 부여앱 보호 정책 필요.
  6. 정책 구성이 완료되면 만들기 를 선택하여 정책을 저장하고 적용합니다.
  7. 정책 사용 설정
  8. 또한 사용자가 MAM 정책의 대상인지 확인해야 합니다.

테스트 사례

테스트 사례 테스트 방법 예상 결과
MAM-CA 항상 적용됨 앱에 등록하기 전에 사용자가 앱 보호 CA 및 MAM 정책 모두의 대상인지 확인합니다. 앱이 위에서 설명한 수정 사례를 처리하고 앱이 액세스 토큰을 얻을 수 있는지 확인합니다.
사용자가 등록한 후 MAM-CA가 적용됩니다. 사용자가 이미 앱에 로그인되어 있어야 하지만 앱 보호 CA의 대상이 아님을 의미합니다. 콘솔에서 App Protection CA의 사용자를 대상으로 지정하고 MAM 수정을 올바르게 처리하는지 확인합니다
MAM-CA 규정 위반 App Protection CA 정책을 설정하되 MAM 정책을 할당하지는 않습니다. 사용자가 액세스 토큰을 획득할 수 없어야 합니다. 이 기능은 앱에서 IntuneMAMComplianceStatus 오류 사례를 처리하는 방법을 테스트하는 데 유용합니다.

다음 단계

위의 모든 종료 조건 을 완료하면 이제 앱이 앱 보호 CA 지원과 성공적으로 통합됩니다. 후속 섹션인 7단계: 웹 보기 기능은 앱에서 원하는 앱 보호 정책 지원에 따라 필요할 수도 있고 필요하지 않을 수도 있습니다.