적용 대상:
다음 콘텐츠가 외부 테넌트에
외부 테넌트(자세한 정보)
이 자습서에서는 .NET 디먼 앱에서 보호된 웹 API를 호출하는 방법을 보여 줍니다. 클라이언트 디먼 앱에서 자체 ID를 사용하여 액세스 토큰을 획득한 다음, 웹 API를 호출할 수 있도록 설정합니다. 이 경우 보호된 Microsoft Graph 엔드포인트를 호출합니다.
이 자습서에서는 다음을 수행합니다.
- 앱 등록 세부 정보를 사용하도록 디먼 앱을 구성합니다. Microsoft Graph API에 대한 User.Read.All 권한을 앱에 부여해야 합니다.
- 자체적으로 토큰을 획득하고 보호된 웹 API를 호출하는 디먼 앱을 빌드합니다.
필수 구성 요소
- .NET입니다. 이 자습서에서는 .NET 9.0을 사용합니다.
- Visual Studio Code 또는 다른 코드 편집기.
-
귀하의 테넌트의 앱 등록. 앱 등록 세부 정보에서 다음 항목이 있는지 확인합니다.
- 등록한 클라이언트 웹앱의 애플리케이션 ID (클라이언트 ID)입니다.
- 웹앱을 등록한 디렉터리(테넌트) ID.
- 만든 웹앱에 대한 클라이언트 암호 값입니다.
.NET 디먼 앱 만들기
터미널을 열고 프로젝트를 사용할 폴더로 이동합니다.
.NET 콘솔 앱을 초기화하고 루트 폴더로 이동합니다.
dotnet new console -n DotnetDaemon cd DotnetDaemon
패키지 설치
Microsoft.Identity.Web 및 Microsoft.Identity.Web.DownstreamApi 패키지를 설치합니다.
dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.DownstreamApi
Microsoft.Identity.Web 앱에 인증 및 권한 부여 기능을 더 쉽게 추가할 수 있도록 ASP.NET Core, 인증 미들웨어 및 .NET용 MSAL(Microsoft 인증 라이브러리) 사이에 붙이기를 제공합니다.
Microsoft.Identity.Web.DownstreamApi 다운스트림 API를 호출하는 데 사용되는 인터페이스를 제공합니다.
appsettings.json 파일을 만들고 등록 구성을 추가하십시오.
앱의 루트 폴더에 appsettings.json 파일을 만듭니다.
appsettings.json 파일에 앱 등록 세부 정보를 추가합니다.
{ "AzureAd": { // "Authority": "", you can use this for customer tenants in place of Instance and TenantId values "Instance": "https://login.microsoftonline.com/", "TenantId": "Enter_the_Tenant_ID_Here", "ClientId": "Enter_the_Application_ID_Here", "ClientCredentials": [ { "SourceType": "ClientSecret", "ClientSecret": "Enter_the_Client_Secret_Here" } ] }, "DownstreamApi": { "BaseUrl": "https://graph.microsoft.com", "RelativePath": "/v1.0/users/", "RequestAppToken": true, "Scopes": [ "https://graph.microsoft.com/.default" ] } }다음 값을 사용자 고유의 값으로 바꿉다.
값 묘사 여기 애플리케이션 ID를 입력하십시오 등록한 클라이언트 디먼 앱의 애플리케이션(클라이언트) ID입니다. Enter_the_Client_Secret_Here 당신이 생성한 데몬 앱 비밀 값입니다. 테넌트 ID를 여기에 입력하세요 앱이 등록된 디렉터리/테넌트 테넌트 ID입니다. 메모
외부 테넌트에 등록된 앱의 경우 기관 사용하고 인스턴스 및 TenantId모두 제거할 수 있습니다.
"Authority": "https://<Enter_the_Tenant_Subdomain_Here>.ciamlogin.com/"; 여기서 Enter_the_Tenant_Subdomain_Here 테넌트 하위 도메인입니다.프로젝트 파일에 appsettings.json 파일을 추가합니다. 프로젝트 파일은 프로젝트의 .csproj 파일입니다. 파일이 출력 디렉터리에 복사되어야 하기 때문입니다.
<ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
액세스 토큰 획득
코드 편집기에서 program.cs 파일을 열고 해당 내용을 삭제합니다.
파일에 패키지를 추가합니다.
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web;토큰 획득 인스턴스를 만듭니다.
GetDefaultInstance패키지의TokenAcquirerFactory클래스의Microsoft.Identity.Web메서드를 사용하여 토큰 획득 인스턴스를 빌드합니다. 기본적으로 인스턴스는 앱과 동일한 폴더에 있는 경우 appsettings.json 파일을 읽습니다.GetDefaultInstance서비스 컬렉션에 서비스를 추가할 수도 있습니다.program.cs 파일에 다음 코드 줄을 추가합니다.
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();구성에서 읽을 애플리케이션 옵션을 구성하고
DownstreamApi서비스를 추가합니다.DownstreamApi서비스는 다운스트림 API를 호출하는 데 사용되는 인터페이스를 제공합니다. config 개체에서 이 서비스를 DownstreamAPI 호출합니다. 디먼 앱은 appsettings.jsonDownstreamApi 섹션에서 다운스트림 API 구성을 읽습니다. 기본적으로 메모리 내 토큰 캐시를 가져옵니다.program.cs 파일에 다음 코드 조각을 추가합니다.
const string ServiceName = "DownstreamApi"; tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName, tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));호출하는 다운스트림 API는 Microsoft Graph입니다. 이 자습서에서는
DownstreamApi서비스를 사용합니다. Microsoft Graph SDK를 사용할 수도 있습니다.토큰 획득자를 빌드합니다. 추가한 모든 서비스를 구성하고 서비스 공급자를 반환합니다. 이 서비스 공급자를 사용하여 추가하는 API 리소스에 액세스할 수 있습니다. 이 경우 액세스하려는 다운스트림 서비스로 API 리소스를 하나만 추가합니다.
program.cs 파일에 다음 코드 조각을 추가합니다.
var serviceProvider = tokenAcquirerFactory.Build();
웹 API 호출
IDownstreamApi인터페이스를 사용하여 보호된 웹 API를 호출하는 코드를 추가합니다. 이 자습서에서는 Microsoft Graph API 엔드포인트를 호출합니다.program.cs 파일에 다음 코드를 추가합니다.
try { IDownstreamApi downstreamApi = serviceProvider.GetRequiredService<IDownstreamApi>(); var response = await downstreamApi.GetForAppAsync<HttpResponseMessage>("DownstreamApi"); var content = await response.Content.ReadAsStringAsync(); var statusCode = response.StatusCode; Console.WriteLine($"Response status code: {statusCode}"); if (!content.Any()) { Console.WriteLine("There are no users to display."); return; } Console.WriteLine(content); } catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }이 코드는 appsettings.json 파일에 정의한 엔드포인트를 호출합니다.
GetForAppAsync인터페이스의IDownstreamApi메서드는 엔드포인트를 호출하는 데 사용됩니다. 앱은 자체적으로 호출합니다. 메서드는HttpResponseMessage개체를 반환합니다. 그런 다음 응답이 문자열로 읽혀지고 콘솔에 표시됩니다.
클라이언트 디먼 앱 실행
디먼 앱의 루트 폴더로 이동하고 다음 명령을 실행합니다.
dotnet run
모든 것이 정상이면 터미널에서 응답 상태 코드: OK가 표시되어야 합니다. 사용자가 있는 경우 사용자가 터미널에 나열됩니다. 그렇지 않으면 표시할 사용자가 없습니다메시지가 표시됩니다.
오류가 발생하면 터미널에 오류 메시지가 표시됩니다.
문제 해결
오류가 발생할 경우
- appsettings.json 파일에 추가한 등록 세부 정보를 확인합니다.
- 프로젝트 파일에 appsettings.json 파일을 추가했음을 확인합니다.
- 앱 권한이 올바르게 구성되었는지 확인합니다.