다음을 통해 공유


자습서: .NET 디먼 앱에서 보호된 웹 API 호출

적용: 흰색 확인 표시 기호가 있는 녹색 원. 워크포스 사용자에게 적용: 흰색 확인 표시 기호가 있는 녹색 원 . 외부 사용자(자세한 내용은)

이 자습서에서는 .NET 디먼 앱에서 보호된 웹 API를 호출하는 방법을 보여 줍니다. 클라이언트 디먼 앱에서 자체 ID를 사용하여 액세스 토큰을 획득한 다음, 웹 API를 호출할 수 있도록 설정합니다. 이 경우 보호된 Microsoft Graph 엔드포인트를 호출합니다.

이 자습서에서는 다음을 수행합니다.

  • 앱 등록 세부 정보를 사용하도록 디먼 앱을 구성합니다. Microsoft Graph API에 대한 User.Read.All 권한을 앱에 부여해야 합니다.
  • 자체적으로 토큰을 획득하고 보호된 웹 API를 호출하는 디먼 앱을 빌드합니다.

필수 구성 요소

.NET 디먼 앱 만들기

  1. 터미널을 열고 프로젝트를 사용할 폴더로 이동합니다.

  2. .NET 콘솔 앱을 초기화하고 루트 폴더로 이동합니다.

    dotnet new console -n DotnetDaemon
    cd DotnetDaemon
    

패키지 설치

Microsoft.Identity.WebMicrosoft.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 파일을 만들고 등록 구성을 추가하십시오.

  1. 앱의 루트 폴더에 appsettings.json 파일을 만듭니다.

  2. 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 테넌트 하위 도메인입니다.

  3. 프로젝트 파일에 appsettings.json 파일을 추가합니다. 프로젝트 파일은 프로젝트의 .csproj 파일입니다. 파일이 출력 디렉터리에 복사되어야 하기 때문입니다.

    <ItemGroup>
        <None Update="appsettings.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
    

액세스 토큰 획득

  1. 코드 편집기에서 program.cs 파일을 열고 해당 내용을 삭제합니다.

  2. 파일에 패키지를 추가합니다.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    
  3. 토큰 획득 인스턴스를 만듭니다. GetDefaultInstance 패키지의 TokenAcquirerFactory 클래스의 Microsoft.Identity.Web 메서드를 사용하여 토큰 획득 인스턴스를 빌드합니다. 기본적으로 인스턴스는 앱과 동일한 폴더에 있는 경우 appsettings.json 파일을 읽습니다. GetDefaultInstance 서비스 컬렉션에 서비스를 추가할 수도 있습니다.

    program.cs 파일에 다음 코드 줄을 추가합니다.

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. 구성에서 읽을 애플리케이션 옵션을 구성하고 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를 사용할 수도 있습니다.

  5. 토큰 획득자를 빌드합니다. 추가한 모든 서비스를 구성하고 서비스 공급자를 반환합니다. 이 서비스 공급자를 사용하여 추가하는 API 리소스에 액세스할 수 있습니다. 이 경우 액세스하려는 다운스트림 서비스로 API 리소스를 하나만 추가합니다.

    program.cs 파일에 다음 코드 조각을 추가합니다.

    var serviceProvider = tokenAcquirerFactory.Build();
    

웹 API 호출

  1. IDownstreamApi 인터페이스를 사용하여 보호된 웹 API를 호출하는 코드를 추가합니다. 이 자습서에서는 Microsoft Graph API 엔드포인트를 호출합니다.

  2. 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 파일을 추가했음을 확인합니다.
  • 앱 권한이 올바르게 구성되었는지 확인합니다.