다음을 통해 공유


iOS용 앱 SDK Intune - App Protection CA 지원(선택 사항)

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

참고

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

6단계: App Protection CA 지원

스테이지 Goals

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

의존 관계

Intune SDK 외에도 앱에서 App Protection CA를 사용하도록 설정하려면 이러한 두 구성 요소가 필요합니다.

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

MAM-CA 수정 흐름

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

새 API

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

새 동작 설명
앱 → ADAL/MSAL: 토큰 획득 애플리케이션이 토큰을 획득하려고 하면 ERROR_SERVER_PROTECTION_POLICY_REQUIRED 받을 준비가 되어 있어야 합니다. 앱은 초기 계정 추가 흐름 중에 또는 애플리케이션 수명 주기의 뒷부분에서 토큰에 액세스할 때 이 오류를 받을 수 있습니다. 앱이 이 오류를 수신하면 액세스 토큰이 부여되지 않으며 서버 데이터를 검색하기 위해 수정해야 합니다.
앱 → 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 구성에 클라이언트 기능 변수를 추가하여 App Protection 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 매개 변수에 대한 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>보안>조건부 액세스>새 정책을 선택합니다. 새 조건부 액세스 정책을 Create.
  3. 다음 항목을 설정하여 조건부 액세스 정책을 구성합니다.
    • 이름 필드를 입력합니다.
    • 정책을 사용하도록 설정합니다.
    • 사용자 또는 그룹에 정책 할당
  4. 클라우드 앱을 할당합니다. 모든 클라우드 앱포함>을 선택합니다. 경고 정보로 이 설정을 잘못 구성하지 않도록 주의해야 합니다. 예를 들어 모든 클라우드 앱을 제외한 경우 콘솔에서 자신을 잠급니다.
  5. 액세스 제어 권한 부여앱 보호 정책 필요를 선택하여 액세스 > 제어를 부여합니다>.
  6. 정책 구성이 완료되면 Create 선택하여 정책을 저장하고 적용합니다.
  7. 정책 사용 설정
  8. 또한 사용자가 MAM 정책의 대상이 되도록 해야 합니다.

테스트 사례

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

다음 단계

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