다음을 통해 공유


빠른 시작: 샘플 디먼 앱에서 웹 API 호출

적용 대상: 흰색 확인 표시 기호가 있는 녹색 원. Workforce 테넌트 흰색 확인 표시 기호가 있는 녹색 원. 외부 테넌트 (자세히 알아보기)

이 빠른 시작에서는 샘플 디먼 애플리케이션을 사용하여 액세스 토큰을 획득하고 MSAL(Microsoft 인증 라이브러리) 사용하여 보호된 웹 API를 호출합니다.

시작하기 전에 이 페이지의 맨 위에 있는 테넌트 유형 선택기를 선택하여 테넌트 유형을 선택합니다. Microsoft Entra ID는 두 가지 테넌트 구성, 직원외부를 제공합니다. 직원 테넌트 구성은 직원, 내부 앱 및 기타 조직 리소스를 위한 것입니다. 외부 테넌트는 고객용 앱용입니다.

이 빠른 시작에서 사용하는 샘플 앱은 Microsoft Graph API를 호출하는 액세스 토큰을 획득합니다.

필수 구성 요소

  • 활성 구독이 있는 Azure 계정입니다. 계정이 아직 없으시다면 계정을 무료로 만드세요.
  • 이 Azure 계정에는 애플리케이션을 관리할 수 있는 권한이 있어야 합니다. 다음 Microsoft Entra 역할에는 필요한 권한이 포함됩니다.
    • 애플리케이션 관리자
    • 애플리케이션 개발자
    • 클라우드 애플리케이션 관리자
  • 인력 임차인입니다. 기본 디렉터리를 사용하거나 을 설정하여 새 테넌트을 만들 수 있습니다.
  • 새 앱을 Microsoft Entra 관리 센터에 등록하고, 해당 조직 디렉터리의 계정만을 위해 구성합니다. 애플리케이션 등록에서 자세한 내용을 참조하세요. 다음 값을 애플리케이션 개요 페이지에서 기록하여 나중에 사용하십시오.
    • 애플리케이션(클라이언트) ID
    • 디렉터리(테넌트) ID
  • 앱 등록에 클라이언트 비밀을 추가합니다. 프로덕션 앱에서는 클라이언트 비밀을 사용하지 마세요. 대신 인증서 또는 페더레이션된 자격 증명을 사용합니다. 자세한 내용은 애플리케이션에 자격 증명 추가를 참조하세요.

디먼 앱에 API 권한 부여

디먼 앱이 Microsoft Graph API의 데이터에 액세스하려면 필요한 권한을 부여합니다. 디먼 앱에는 애플리케이션 유형 권한이 필요합니다. 사용자는 디먼 애플리케이션과 상호 작용할 수 없으므로 테넌트 관리자는 이러한 권한에 동의해야 합니다. 사용 권한을 부여하고 동의하려면 다음 단계를 사용합니다.

.NET 디먼 앱의 경우 사용 권한을 부여하고 동의할 필요가 없습니다. 이 디먼 앱은 자체 앱 등록 정보를 읽으므로 애플리케이션 권한을 부여하지 않고도 읽을 수 있습니다.

샘플 애플리케이션 복제 또는 다운로드

샘플 애플리케이션을 가져오려면 GitHub에서 복제하거나 .zip 파일로 다운로드할 수 있습니다.

  • 샘플을 복제하려면 명령 프롬프트를 열고 프로젝트를 만들 위치로 이동하고 다음 명령을 입력합니다.
git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git
  • .zip 파일다운로드합니다. 이름 길이가 260자 미만인 파일 경로로 추출합니다.

프로젝트 구성

클라이언트 디먼 앱 샘플에서 앱 등록 세부 정보를 사용하려면 다음 단계를 사용합니다.

  1. 콘솔 창을 연 다음 ms-identity-docs-code-dotnet/console-daemon 디렉터리로 이동합니다.

    cd ms-identity-docs-code-dotnet/console-daemon
    
  2. Program.cs 열고 파일 내용을 다음 코드 조각으로 바꿉니다.

     // Full directory URL, in the form of https://login.microsoftonline.com/<tenant_id>
     Authority = " https://login.microsoftonline.com/Enter_the_tenant_ID_obtained_from_the_Microsoft_Entra_admin_center",
     // 'Enter the client ID obtained from the Microsoft Entra admin center
     ClientId = "Enter the client ID obtained from the Microsoft Entra admin center",
     // Client secret 'Value' (not its ID) from 'Client secrets' in the Microsoft Entra admin center
     ClientSecret = "Enter the client secret value obtained from the Microsoft Entra admin center",
     // Client 'Object ID' of app registration in Microsoft Entra admin center - this value is a GUID
     ClientObjectId = "Enter the client Object ID obtained from the Microsoft Entra admin center"
    
    • Authority - 인증 기관은 MSAL이 토큰을 요청할 수 있는 디렉터리를 나타내는 URL입니다. Microsoft_Entra_관리_센터에서_획득한_테넌트_ID를_입력하세요 이전에 기록된 디렉터리(테넌트) ID 값으로 변경하세요.
    • ClientId - 클라이언트라고도 하는 애플리케이션의 식별자입니다. 따옴표로 된 텍스트를 등록된 애플리케이션의 개요 페이지에서 이전에 기록된 Application (client) ID 값으로 바꿉니다.
    • ClientSecret - Microsoft Entra 관리 센터에서 애플리케이션에 대해 만든 클라이언트 암호입니다. 클라이언트 암호의 입력합니다.
    • ClientObjectId - 클라이언트 애플리케이션의 개체 ID입니다. 따옴표로 된 텍스트를 등록된 애플리케이션의 개요 페이지에서 이전에 기록한 Object ID 값으로 바꿉니다.

애플리케이션 실행 및 테스트

샘플 앱을 구성했습니다. 계속 실행하고 테스트할 수 있습니다.

콘솔 창에서 다음 명령을 실행하여 애플리케이션을 빌드하고 실행합니다.

dotnet run

애플리케이션이 성공적으로 실행되면 다음 코드 조각과 유사한 응답을 표시합니다(간결성을 위해 단축됨).

{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#applications/$entity",
"id": "00001111-aaaa-2222-bbbb-3333cccc4444",
"deletedDateTime": null,
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"applicationTemplateId": null,
"disabledByMicrosoftStatus": null,
"createdDateTime": "2021-01-17T15:30:55Z",
"displayName": "identity-dotnet-console-app",
"description": null,
"groupMembershipClaims": null,
...
}

작동 방식

디먼 애플리케이션은 사용자를 대신하여 토큰을 획득하지 않습니다. 사용자는 자신의 ID가 필요하기 때문에 디먼 애플리케이션과 상호 작용할 수 없습니다. 이 유형의 애플리케이션은 애플리케이션 ID, 자격 증명(비밀 또는 인증서) 및 애플리케이션 ID URI를 제공하여 애플리케이션 ID를 사용하여 액세스 토큰을 요청합니다. 디먼 애플리케이션은 표준 OAuth 2.0 클라이언트 자격 증명 부여 흐름 사용하여 액세스 토큰을 획득합니다.

앱은 Microsoft ID 플랫폼에서 액세스 토큰을 획득합니다. 액세스 토큰의 범위는 Microsoft Graph API로 지정됩니다. 그런 다음, 앱은 액세스 토큰을 사용하여 Microsoft Graph API에서 자체 애플리케이션 등록 세부 정보를 요청합니다. 액세스 토큰에 올바른 권한이 있는 한 앱은 Microsoft Graph API에서 모든 리소스를 요청할 수 있습니다.

이 샘플에서는 사용자 ID 대신 애플리케이션 ID를 사용하여 무인 작업 또는 Windows 서비스를 실행하는 방법을 보여 줍니다.

필수 구성 요소

클라이언트 암호 만들기

등록된 애플리케이션에 대한 클라이언트 암호를 만듭니다. 애플리케이션은 클라이언트 비밀을 사용하여 토큰을 요청할 때 해당 ID를 증명합니다.

  1. 앱 등록 페이지에서 만든 애플리케이션(예: 웹앱 클라이언트 암호)을 선택하여 개요 페이지를 엽니다.
  2. 관리아래에서 인증서 & 비밀>클라이언트 비밀>새 클라이언트 비밀을 선택합니다.
  3. 설명 상자에 클라이언트 암호에 대한 설명(예: 웹앱 클라이언트 암호 )을 입력합니다.
  4. 만료아래에서 비밀이 유효한 기간을 선택한 다음(조직 보안 규칙에 따라) 추가를 선택합니다.
  5. 비밀의 기록합니다. 이후 단계에서 구성에 이 값을 사용합니다. 인증서 및 비밀페이지에서 이동하면 비밀 값이 다시 표시되지 않으며, 어떤 방법으로도 다시 가져올 수 없습니다. 기록해야 합니다.

기밀 클라이언트 애플리케이션에 대한 자격 증명을 만드는 경우:

  • 애플리케이션을 프로덕션 환경으로 이동하기 전에 클라이언트 암호 대신 인증서를 사용하는 것이 좋습니다. 인증서를 사용하는 방법에 대한 자세한 내용은 Microsoft ID 플랫폼 애플리케이션 인증 인증서 자격 증명지침을 참조하세요.

  • 테스트를 위해 자체 서명된 인증서를 만들고 인증하도록 앱을 구성할 수 있습니다. 그러나 프로덕션 환경 에서, 잘 알려진 인증 기관에서 서명한 인증서를 구매한 후, Azure Key Vault를 사용하여 인증서 액세스 및 수명을 관리해야 합니다.

디먼 앱에 API 권한 부여

  1. 앱 등록 페이지에서 만든 애플리케이션(예: ciam-client-app)을 선택합니다.

  2. 관리아래에서 API 권한을선택합니다.

  3. 구성된 권한에서 사용 권한 추가를 선택합니다.

  4. 조직에서 사용하는 API를 탭에서 선택합니다.

  5. API 목록에서 ciam-ToDoList-api같은 API를 선택합니다.

  6. 애플리케이션 사용 권한 옵션을 선택합니다. 앱이 사용자를 대신하여 로그인하지 않고 그 자체로 로그인할 때 이 옵션을 선택합니다.

  7. 사용 권한 목록에서 TodoList.Read.All, ToDoList.ReadWrite.All 선택합니다(필요한 경우 검색 상자 사용).

  8. 권한 추가 단추를 선택합니다.

  9. 이 시점에서 사용 권한을 올바르게 할당했습니다. 그러나 디먼 앱은 사용자가 상호 작용할 수 없으므로 사용자 자체는 이러한 권한에 동의할 수 없습니다. 이 문제를 해결하려면 관리자가 테넌트에 있는 모든 사용자를 대신하여 이러한 권한에 동의해야 합니다.

    1. 테넌트 이름<>에 대한 관리자 동의 부여()을 선택한 다음, 을 선택합니다.
    2. 새로 고침을선택한 다음, 테넌트 이름<>대해 부여된 두 권한에 대한 상태 표시되는지 확인합니다.

앱 역할 구성

API는 클라이언트 앱이 자체 액세스 토큰을 얻을 수 있도록 하기 위해 최소 하나 이상의 앱 역할(애플리케이션 권한 )을 애플리케이션에 게시해야 합니다. 애플리케이션 권한은 API가 클라이언트 애플리케이션이 자체 인증에 성공하고 사용자를 로그인할 필요가 없을 때 게시해야 하는 사용 권한의 유형입니다. 애플리케이션 권한을 게시하려면 다음 단계를 수행합니다.

  1. 앱 등록 페이지에서 만든 애플리케이션(예: ciam-ToDoList-api)을 선택하여 개요 페이지를 엽니다.

  2. 관리아래에서 앱 역할선택합니다.

  3. 앱 역할 만들기선택한 다음, 다음 값을 입력한 다음, 적용 선택하여 변경 내용을 저장합니다.

    재산
    표시 이름 ToDoList.Read.All
    허용되는 멤버 형식 애플리케이션
    ToDoList.Read.All
    묘사 앱이 'TodoListApi' 사용하여 모든 사용자의 ToDo 목록을 읽을 수 있도록 허용
    이 앱 역할을 사용하도록 설정하시겠습니까? 계속 확인
  4. 앱 역할 만들기 다시 선택한 다음 두 번째 앱 역할에 대해 다음 값을 입력한 다음, 적용 선택하여 변경 내용을 저장합니다.

    재산
    표시 이름 ToDoList.ReadWrite.전체
    허용되는 멤버 형식 애플리케이션
    ToDoList.ReadWrite.전체
    묘사 앱이 'ToDoListApi' 사용하여 모든 사용자의 ToDo 목록을 읽고 쓰도록 허용합니다.
    이 앱 역할을 사용하도록 설정하시겠습니까? 계속 확인

선택적 클레임 구성

idtyp 선택적 클레임을 추가하여 웹 API에서 토큰이 토큰인지 아니면 앱 + 사용자 토큰인지 확인할 수 있습니다. scp역할의 조합을 동일한 용도로 클레임을 사용할 수 있지만 idtyp 클레임을 사용하는 것이 앱 토큰과 앱 + 사용자 토큰을 구분하는 가장 쉬운 방법입니다. 예를 들어 토큰이 앱 전용 토큰인 경우 이 클레임의 값은 입니다.

샘플 디먼 애플리케이션 및 웹 API 복제 또는 다운로드

샘플 애플리케이션을 가져오려면 GitHub에서 복제하거나 .zip 파일로 다운로드할 수 있습니다.

  • 샘플을 복제하려면 명령 프롬프트를 열고 프로젝트를 만들 위치로 이동하고 다음 명령을 입력합니다.

    git clone https://github.com/Azure-Samples/ms-identity-ciam-javascript-tutorial.git
    
  • 샘플 .zip 파일를 다운로드한 후, 이름 길이가 260자 미만인 파일 경로로 추출하십시오.

프로젝트 종속성 설치

  1. 콘솔 창을 열고 Node.js 샘플 앱이 포함된 디렉터리로 변경합니다.

    cd 2-Authorization\3-call-api-node-daemon\App
    
  2. 다음 명령을 실행하여 앱 종속성을 설치합니다.

    npm install && npm update
    

샘플 디먼 앱 및 API 구성

클라이언트 웹앱 샘플에서 앱 등록 세부 정보를 사용하려면 다음 단계를 사용합니다.

  1. 코드 편집기에서 App\authConfig.js 파일을 엽니다.

  2. 자리 표시자를 찾으세요.

    • Enter_the_Application_Id_Here 이전에 등록한 디먼 앱의 애플리케이션(클라이언트) ID로 바꿉니다.

    • Enter_the_Tenant_Subdomain_Here 디렉터리(테넌트) 하위 도메인으로 바꿉니다. 예를 들어 테넌트 주 도메인이 contoso.onmicrosoft.com경우 contoso사용합니다. 테넌트 이름이 없는 경우 테넌트 세부 정보를 읽는 방법을알아봅니다.

    • Enter_the_Client_Secret_Here 이전에 복사한 디먼 앱 비밀 값으로 바꿉니다.

    • Enter_the_Web_Api_Application_Id_Here 이전에 복사한 웹 API의 애플리케이션(클라이언트) ID로 바꿉니다.

웹 API 샘플에서 앱 등록을 사용하려면 다음을 수행합니다.

  1. 코드 편집기에서 API\ToDoListAPI\appsettings.json 파일을 엽니다.

  2. 자리 표시자를 찾으세요.

    • Enter_the_Application_Id_Here 복사한 웹 API의 애플리케이션(클라이언트) ID로 바꿉니다.

    • Enter_the_Tenant_Id_Here 이전에 복사한 디렉터리(테넌트) ID로 바꿉니다.

    • Enter_the_Tenant_Subdomain_Here 디렉터리(테넌트) 하위 도메인으로 바꿉니다. 예를 들어 테넌트 주 도메인이 contoso.onmicrosoft.com경우 contoso사용합니다. 테넌트 이름이 없는 경우 테넌트 세부 정보를 읽는 방법을알아봅니다.

샘플 디먼 앱 및 API 실행 및 테스트

샘플 앱을 구성했습니다. 계속 실행하고 테스트할 수 있습니다.

  1. 콘솔 창을 열고 다음 명령을 사용하여 웹 API를 실행합니다.

    cd 2-Authorization\3-call-api-node-daemon\API\ToDoListAPI
    dotnet run
    
  2. 다음 명령을 사용하여 웹앱 클라이언트를 실행합니다.

    2-Authorization\3-call-api-node-daemon\App
    node . --op getToDos
    

디먼 앱 및 웹 API가 성공적으로 실행되면 콘솔 창에 다음 JSON 배열과 유사한 항목이 표시됩니다.

{
    "id": 1,
    "owner": "3e8....-db63-43a2-a767-5d7db...",
    "description": "Pick up grocery"
},
{
    "id": 2,
    "owner": "c3cc....-c4ec-4531-a197-cb919ed.....",
    "description": "Finish invoice report"
},
{
    "id": 3,
    "owner": "a35e....-3b8a-4632-8c4f-ffb840d.....",
    "description": "Water plants"
}

작동 방식

Node.js 앱은 OAuth 2.0 클라이언트 자격 증명 부여 흐름 사용하여 사용자가 아닌 자체에 대한 액세스 토큰을 획득합니다. 앱이 요청하는 액세스 토큰에는 역할로 표시되는 권한이 포함됩니다. 클라이언트 자격 증명 흐름은 애플리케이션 토큰에 대한 사용자 범위 대신 이 권한 집합을 사용합니다. 이전에 웹 API에서 이러한 애플리케이션 권한을 노출한 디먼 앱 부여했습니다.

샘플 .NET 웹 API인 API 쪽에서 API는 액세스 토큰에 필요한 권한(애플리케이션 권한)이 있는지 확인해야 합니다. 웹 API는 필요한 권한이 없는 액세스 토큰을 수락할 수 없습니다.

데이터에 대한 액세스

Web API 엔드포인트는 사용자와 애플리케이션 모두에서 호출을 수락하도록 준비해야 합니다. 따라서 각 요청에 적절하게 응답하는 방법이 있어야 합니다. 예를 들어 위임된 권한/범위를 통해 사용자의 호출은 사용자의 데이터 to-do 목록을 받습니다. 반면 애플리케이션 권한/역할을 통해 애플리케이션에서 호출하면 전체 to-do 목록을 받을 수 있습니다. 그러나 이 문서에서는 애플리케이션 호출만 수행하므로 위임된 권한/범위를 구성할 필요가 없습니다.