자습서: Microsoft ID 플랫폼 사용하는 다중 테넌트 디먼 빌드

이 자습서에서는 OAuth 2.0 클라이언트 자격 증명 부여를 사용하여 Microsoft Graph API를 호출하는 액세스 토큰을 가져오는 방법을 보여주는 ASP.NET 디먼 웹앱을 다운로드하고 실행합니다.

이 자습서에서:

  • 디먼 앱과 Microsoft ID 플랫폼 통합
  • 관리자가 앱에 직접 애플리케이션 권한 부여
  • Microsoft Graph API를 호출할 액세스 토큰 가져오기
  • Microsoft Graph API를 호출합니다.

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

사전 요구 사항

  • Visual Studio 2017 또는 2019
  • Microsoft Entra 테넌트. 자세한 내용은 Microsoft Entra 테넌트를 가져오는 방법을 참조하세요.
  • 테넌트에 있는 하나 이상의 사용자 계정. 이 샘플은 Microsoft 계정에서 작동하지 않습니다. Microsoft 계정으로 로그인하여 사용자 계정을 디렉터리에 만든 적이 없는 경우 지금 이 작업을 수행합니다.

시나리오

앱은 ASP.NET MVC 애플리케이션으로 빌드됩니다. OWIN OpenID Connect 미들웨어를 사용하여 사용자를 로그인합니다.

이 샘플의 "daemon" 구성 요소는 SyncController.cs API 컨트롤러입니다. 컨트롤러가 호출되면 Microsoft Graph에서 고객의 Microsoft Entra 테넌트에 있는 사용자 목록을 가져옵니다. SyncController.cs는 웹 애플리케이션의 AJAX 호출을 통해 트리거되며, .NET용 MSAL(Microsoft 인증 라이브러리)을 사용하여 Microsoft Graph에 대한 액세스 토큰을 획득합니다.

앱은 Microsoft 비즈니스 고객을 위한 다중 테넌트 앱이므로 고객이 애플리케이션을 회사 데이터에 "등록" 또는 "연결"할 수 있는 방법을 제공해야 합니다. 연결 흐름 중에 전역 관리자는 먼저 로그인한 사용자가 없어도 비대화형 방식으로 회사 데이터에 액세스할 수 있도록 애플리케이션 권한을 앱에 직접 부여합니다. 이 샘플의 논리 대부분에서는 ID 플랫폼의 관리자 동의 엔드포인트를 사용하여 이 연결 흐름을 수행하는 방법을 보여 줍니다.

Diagram shows UserSync App with three local items connecting to Azure, with Start dot Auth acquiring a token interactively to connect to Microsoft Entra ID, AccountController getting admin consent to connect to Microsoft Entra ID, and SyncController reading user to connect to Microsoft Graph.

이 샘플에 사용되는 개념에 대한 자세한 내용은 ID 플랫폼의 클라이언트 자격 증명 프로토콜 설명서를 참조하세요.

이 리포지토리 복제 또는 다운로드

셸 또는 명령줄에서 다음 명령을 입력합니다.

git clone https://github.com/Azure-Samples/active-directory-dotnet-daemon-v2.git

또는 샘플을 ZIP 파일로 다운로드합니다.

애플리케이션 등록

이 샘플에는 하나의 프로젝트가 있습니다. Microsoft Entra 테넌트에 애플리케이션을 등록하려면 다음 중 하나를 수행할 수 있습니다.

  • 테넌트 선택테넌트를 사용하도록 샘플 구성의 단계를 따릅니다.
  • 다음을 수행하는 PowerShell 스크립트를 사용합니다.
    • Microsoft Entra 애플리케이션 및 관련 개체(암호, 권한, 종속성)를 자동으로 만듭니다.
    • Visual Studio 프로젝트의 구성 파일을 수정합니다.

자동화를 사용하려면 다음을 수행합니다.

  1. Windows에서 PowerShell을 실행하고, 복제된 디렉터리의 루트로 이동합니다.

  2. 다음 명령을 실행합니다.

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
    
  3. 스크립트를 실행하여 Microsoft Entra 애플리케이션을 만들고 그에 따라 샘플 애플리케이션의 코드를 구성합니다.

    .\AppCreationScripts\Configure.ps1
    

    스크립트를 실행하는 다른 방법은 앱 만들기 스크립트에서 설명하고 있습니다.

  4. Visual Studio 솔루션을 열고, 시작을 선택하여 코드를 실행합니다.

자동화를 사용하지 않으려면 다음 섹션의 단계를 사용합니다.

테넌트 선택

이 문서의 단계는 시작하는 포털에 따라 약간 다를 수 있습니다.

  1. 최소한 애플리케이션 개발자 자격으로 Microsoft Entra 관리 센터에 로그인합니다.

  2. 여러 테넌트에 액세스할 수 있는 경우 위쪽 메뉴의 설정 아이콘을 사용하여 디렉터리 + 구독 메뉴에서 애플리케이션을 등록하려는 테넌트로 전환합니다.

  3. ID>애플리케이션>앱 등록으로 이동합니다.

  4. 새 등록을 선택합니다.

  5. 애플리케이션에 대한 이름을 입력합니다(예: dotnet-web-daemon-v2). 이 이름은 앱의 사용자에게 표시될 수 있으며 나중에 변경할 수 있습니다.

  6. 지원되는 계정 유형 섹션에서 모든 조직 디렉터리의 계정을 선택합니다.

  7. 리디렉션 URI(선택 사항) 섹션의 콤보 상자에서 을 선택하고 리디렉션 URI로 https://localhost:44316/https://localhost:44316/Account/GrantPermissions를 입력합니다.

    셋 이상의 리디렉션 URI가 있는 경우 나중에 앱이 성공적으로 만들어지면 인증 탭에서 이러한 URI를 추가해야 합니다.

  8. 등록을 선택하여 애플리케이션을 만듭니다.

  9. 나중에 사용할 수 있도록 앱의 개요 페이지에서 애플리케이션(클라이언트) ID 값을 찾아서 기록해 둡니다. 이 프로젝트의 Visual Studio 구성 파일을 구성하는 데 필요합니다.

  10. 관리에서 인증을 선택합니다.

  11. 프런트 채널 로그 아웃 URLhttps://localhost:44316/Account/EndSession으로 설정합니다.

  12. 암시적 허용 및 하이브리드 흐름 섹션에서 액세스 토큰ID 토큰을 선택합니다. 이 샘플에서는 사용자를 로그인하고 API를 호출하는 암시적 허용 흐름을 사용하도록 설정해야 합니다.

  13. 저장을 선택합니다.

  14. 관리에서 인증서 및 비밀을 선택합니다.

  15. 클라이언트 비밀 섹션에서 새 클라이언트 비밀을 선택합니다.

  16. 키 설명(예: 앱 비밀)을 입력합니다.

  17. 키 기간을 1년 후, 2년 후 또는 만료 기한 제한 없음으로 선택합니다.

  18. 추가를 선택합니다. 안전한 위치에 키 값을 기록합니다. 나중에 Visual Studio에서 프로젝트를 구성하려면 이 키가 필요합니다.

  19. 관리에서 API 권한>권한 추가를 선택합니다.

  20. 일반적으로 사용되는 Microsoft API 섹션에서 Microsoft Graph를 선택합니다.

  21. 애플리케이션 권한 섹션에서 적절한 사용 권한인 User.Read.All이 선택되어 있는지 확인합니다.

  22. 권한 추가를 선택합니다.

테넌트를 사용하도록 샘플 구성

다음 단계에서 ClientID는 "애플리케이션 ID" 또는 AppId와 동일합니다.

Visual Studio에서 솔루션을 열어 프로젝트를 구성합니다.

클라이언트 프로젝트 구성

설치 스크립트를 사용한 경우 변경 내용이 다음과 같이 적용됩니다.

  1. UserSync\Web.Config 파일을 엽니다.
  2. ida:ClientId 앱 키를 찾습니다. 기존 값을 이전에 기록한 dotnet-web-daemon-v2 애플리케이션의 애플리케이션 ID로 바꿉니다.
  3. ida:ClientSecret 앱 키를 찾습니다. 기존 값을 dotnet-web-daemon-v2 앱을 만드는 동안 저장한 키로 바꿉니다.

샘플 실행

솔루션을 정리하고, 솔루션을 다시 빌드하고, UserSync 애플리케이션을 실행한 다음 Microsoft Entra 테넌트에 관리자 권한으로 로그인합니다. 테스트할 Microsoft Entra 테넌트가 없는 경우 이 지침에 따라 테넌트를 가져올 수 있습니다.

로그인하면 앱에서 먼저 사용자에게 로그인하고 사용자 프로필을 읽을 수 있는 권한을 요청합니다. 이 동의를 통해 앱에서 사용자가 비즈니스 사용자임을 확인할 수 있습니다.

User consent

그런 다음 앱은 Microsoft Graph를 통해 Microsoft Entra 테넌트의 사용자 목록을 동기화하려고 시도합니다. 동기화할 수 없는 경우 테넌트 관리자에게 테넌트를 앱에 연결하도록 요청합니다.

그러면 앱에서 테넌트의 사용자 목록을 읽을 수 있는 권한을 요청합니다.

Admin consent

권한을 부여한 후에는 앱에서 로그아웃됩니다. 이 로그아웃을 통해 토큰 캐시에서 Microsoft Graph용 기존 액세스 토큰이 제거됩니다. 다시 로그인하면 획득한 새 토큰에 Microsoft Graph를 호출하는 데 필요한 권한이 부여됩니다.

권한이 부여되면 앱에서 언제든지 사용자를 쿼리할 수 있습니다. 사용자 동기화 단추를 선택하고 사용자 목록을 새로 고쳐 이를 확인할 수 있습니다. 사용자를 추가하거나 제거하고 목록을 다시 동기화합니다. (그러나 앱은 사용자의 첫 페이지만 동기화합니다.)

코드 정보

이 샘플의 관련 코드는 다음 파일에 있습니다.

  • App_Start\Startup.Auth.cs, Controllers\AccountController.cs: 초기 로그인. 특히 컨트롤러의 작업에는 사용자가 강제로 로그인할 수 있도록 하는 Authorize(권한 부여) 특성이 있습니다. 애플리케이션에서 권한 부여 코드 흐름을 사용하여 사용자를 로그인합니다.
  • Controllers\SyncController.cs: 사용자 목록을 로컬 메모리 내 저장소에 동기화합니다.
  • Controllers\UserController.cs: 로컬 메모리 내 저장소의 사용자 목록을 표시합니다.
  • Controllers\AccountController.cs: 관리자 동의 엔드포인트를 사용하여 테넌트 관리자로부터 권한을 획득합니다.

샘플 앱 다시 만들기

  1. Visual Studio에서 새 Visual C#ASP.NET 웹 애플리케이션(.NET Framework) 프로젝트를 만듭니다.
  2. 다음 화면에서 MVC 프로젝트 템플릿을 선택합니다. 나중에 웹 API 컨트롤러를 추가하므로 Web API에 대한 폴더 및 코어 참조도 추가합니다. 프로젝트의 선택된 인증 모드를 기본값, 즉 No Authentication으로 둡니다.
  3. 솔루션 탐색기 창에서 프로젝트, F4 키를 차례로 선택합니다.
  4. 프로젝트 속성에서 SSL 사용True로 설정합니다. SSL URL의 정보를 적어둡니다. 이는 Azure Portal에서 이 애플리케이션의 등록을 구성할 때 필요합니다.
  5. 다음 ASP.NET OWIN 미들웨어 NuGet 패키지를 추가합니다.
    • Microsoft.Owin.Security.ActiveDirectory
    • Microsoft.Owin.Security.Cookies
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.IdentityModel.Protocol.Extensions
    • Microsoft.Owin.Security.OpenIdConnect
    • Microsoft.Identity.Client
  6. App_Start 폴더에서 다음을 수행합니다.
    1. Startup.Auth.cs라는 클래스를 만듭니다.
    2. 네임스페이스 이름에서 .App_Start를 제거합니다.
    3. Startup 클래스의 코드를 샘플 앱의 동일한 파일에 있는 코드로 바꿉니다. 클래스 정의 전체를 사용해야 합니다. 정의가 퍼블릭 클래스 Startup에서 퍼블릭 partial 클래스 Startup으로 변경됩니다.
  7. Startup.Auth.cs에서 Visual Studio IntelliSense에서 제안한 대로 using 문을 추가하여 누락된 참조를 확인합니다.
  8. 마우스 오른쪽 단추로 프로젝트를 클릭하고, 추가를 선택한 다음, 클래스를 선택합니다.
  9. 검색 상자에서 OWIN을 입력합니다. OWIN Startup 클래스가 선택 항목으로 표시됩니다. 이를 선택한 다음, 클래스 이름을 Startup.cs로 지정합니다.
  10. Startup.cs에서 Startup 클래스의 코드를 샘플 앱의 동일한 파일에 있는 코드로 바꿉니다. 다시 한 번 정의가 퍼블릭 클래스 Startup에서 퍼블릭 partial 클래스 Startup으로 변경됩니다.
  11. Models 폴더에서 MsGraphUser.cs라는 새 클래스를 추가합니다. 구현을 샘플에서 이름이 동일한 파일의 내용으로 바꿉니다.
  12. AccountController라는 새 MVC 5 컨트롤러 - 비어 있음 인스턴스를 추가합니다. 구현을 샘플에서 이름이 동일한 파일의 내용으로 바꿉니다.
  13. UserController라는 새 MVC 5 컨트롤러 - 비어 있음 인스턴스를 추가합니다. 구현을 샘플에서 이름이 동일한 파일의 내용으로 바꿉니다.
  14. SyncController라는 새 Web API 2 컨트롤러 - 비어 있음 인스턴스를 추가합니다. 구현을 샘플에서 이름이 동일한 파일의 내용으로 바꿉니다.
  15. 사용자 인터페이스의 경우 Views\Account 폴더에서 GrantPermissions, IndexUserMismatch라는 세 개의 비어 있음(모델 없음) 보기 인스턴스를 추가합니다. Index라는 인스턴스를 Views\User 폴더에 추가합니다. 구현을 샘플에서 이름이 동일한 파일의 내용으로 바꿉니다.
  16. 다양한 보기를 모두 올바르게 연결하도록 Shared_Layout.cshtmlHome\Index.cshtml을 업데이트합니다.

Azure에 샘플 배포

이 프로젝트에는 웹앱 및 웹 API 프로젝트가 있습니다. Azure 웹 사이트에 배포하려면 각 웹 사이트에 대해 다음 단계를 수행합니다.

  1. Azure 웹 사이트를 만듭니다.
  2. 웹앱 및 웹 API를 웹 사이트에 게시합니다.
  3. IIS Express 대신 웹 사이트를 호출하도록 클라이언트를 업데이트합니다.

Azure 웹 사이트에 dotnet-web-daemon-v2 만들기 및 게시

  1. Azure Portal에 로그인합니다.
  2. 왼쪽 위 모서리에서 리소스 만들기를 선택합니다.
  3. >웹앱을 차례로 선택한 다음, 웹 사이트 이름을 지정합니다. 예를 들어 이름을 dotnet-web-daemon-v2-contoso.azurewebsites.net으로 지정합니다.
  4. 구독, 리소스 그룹앱 서비스 계획 및 위치에 대한 정보를 선택합니다. OSWindows이고 게시코드입니다.
  5. 만들기를 선택하고, 앱 서비스가 만들어질 때까지 기다립니다.
  6. 배포 성공 알림이 표시되면 리소스로 이동을 선택하여 새로 만든 앱 서비스로 이동합니다.
  7. 웹 사이트가 만들어지면 대시보드에서 해당 웹 사이트를 찾아서 선택하여 앱 서비스의 개요 화면을 엽니다.
  8. 앱 서비스의 개요 탭에서 게시 프로필 가져오기 링크를 선택하여 게시 프로필을 다운로드하고 저장합니다. 원본 제어에서 배포와 같은 다른 배포 메커니즘을 사용할 수 있습니다.
  9. Visual Studio로 전환하고 다음을 수행합니다.
    1. dotnet-web-daemon-v2 프로젝트로 이동합니다.
    2. 솔루션 탐색기에서 마우스 오른쪽 단추로 프로젝트를 클릭한 다음, 게시를 선택합니다.
    3. 아래쪽 표시줄에서 프로필 가져오기를 선택하고, 이전에 다운로드한 게시 프로필을 가져옵니다.
  10. 구성을 선택합니다.
  11. 연결 탭에서 "https"를 사용하도록 대상 URL을 업데이트합니다. 예를 들어 https://dotnet-web-daemon-v2-contoso.azurewebsites.net를 사용합니다. 다음을 선택합니다.
  12. 설정 탭에서 조직 인증 사용이 선택 취소되어 있는지 확인합니다.
  13. 저장을 선택합니다. 주 화면에서 게시를 선택합니다.

Visual Studio에서 프로젝트를 게시하고, 브라우저를 프로젝트의 URL로 자동으로 엽니다. 프로젝트의 기본 웹 페이지가 표시되면 게시가 성공적으로 수행된 것입니다.

dotnet-web-daemon-v2에 대한 Microsoft Entra 테넌트 애플리케이션 등록 업데이트

  1. Microsoft Entra 관리 센터로 돌아간 다음 앱 등록에서 dotnet-web-daemon-v2 애플리케이션을 선택합니다.
  2. 애플리케이션에 대한 인증 페이지에서 프론트 채널 로그아웃 URL 필드를 서비스 주소로 업데이트합니다. 예를 들면 https://dotnet-web-daemon-v2-contoso.azurewebsites.net/Account/EndSession를 사용합니다.
  3. 브랜딩 메뉴에서 홈 페이지 URL을 서비스 주소로 업데이트합니다. 예를 들면 https://dotnet-web-daemon-v2-contoso.azurewebsites.net를 사용합니다.
  4. 구성을 저장합니다.
  5. 동일한 URL을 인증>리디렉션 URI 메뉴의 값 목록에 추가합니다. 여러 개의 리디렉션 URL이 있는 경우 각 리디렉션 URL에 대해 앱 서비스의 URI를 사용하는 새 항목이 있는지 확인합니다.

리소스 정리

더 이상 필요하지 않은 경우 애플리케이션 등록 단계에서 만든 애플리케이션 개체를 삭제합니다. 애플리케이션을 제거하려면 사용자 또는 조직이 작성한 애플리케이션 제거의 지침을 따르세요.

도움말 보기

Microsoft Q&A를 사용하여 커뮤니티의 지원을 받으세요. 먼저 Microsoft Q&A에 대한 질문을 하고 기존 문제를 탐색하여 이전에 질문을 한 적이 있는지 확인합니다. 질문이나 의견이 azure-ad-adal-deprecation, azure-ad-msaldotnet-standard로 태그가 지정되어 있는지 확인합니다."

샘플에 버그가 있으면 해당 문제를 GitHub 문제에 제기하세요.

MSAL.NET에 버그가 있으면 해당 문제를 MSAL.NET GitHub 문제에 제기하세요.

추천 사항을 제공하려면 사용자 의견 페이지로 이동하세요.

다음 단계

Microsoft ID 플랫폼을 사용하여 보호된 웹 API에 액세스하는 디먼 앱을 빌드하는 방법에 대해 자세히 알아봅니다.