チュートリアル:Windows デスクトップ アプリから Microsoft Graph API を呼び出すTutorial: Call the Microsoft Graph API from a Windows Desktop app

このチュートリアルでは、ユーザーのサインインを処理して Microsoft Graph API を呼び出すためのアクセス トークンを取得するネイティブ Windows デスクトップ .NET (XAML) アプリを作成します。In this tutorial, you build a native Windows Desktop .NET (XAML) app that signs in users and gets an access token to call the Microsoft Graph API.

このガイドを完了すると、アプリケーションで個人アカウント (outlook.com、live.com など) を使用する保護された API を呼び出すことができるようになります。When you've completed the guide, your application will be able to call a protected API that uses personal accounts (including outlook.com, live.com, and others). このアプリケーションでは、Azure Active Directory を使用する会社または組織の職場および学校のアカウントも使用します。The application will also use work and school accounts from any company or organization that uses Azure Active Directory.

このチュートリアルの内容:In this tutorial:

  • Visual Studio で Windows Presentation Foundation (WPF) プロジェクトを作成するCreate a Windows Presentation Foundation (WPF) project in Visual Studio
  • .NET 用 Microsoft 認証ライブラリ (MSAL) をインストールするInstall the Microsoft Authentication Library (MSAL) for .NET
  • Azure portal でアプリケーションを登録するRegister the application in the Azure portal
  • ユーザーのサインインとサインアウトをサポートするコードを追加するAdd code to support user sign-in and sign-out
  • Microsoft Graph API を呼び出すコードを追加するAdd code to call Microsoft Graph API
  • アプリケーションをテストするTest the app

前提条件Prerequisites

このガイドで生成されたサンプル アプリの動作How the sample app generated by this guide works

このチュートリアルで生成されたサンプル アプリの動作の紹介

このガイドで作成するサンプル アプリケーションにより、Windows デスクトップ アプリケーションにおいて、Microsoft ID プラットフォーム エンドポイントからのトークンを受け付ける Microsoft Graph API または Web API に対してクエリを実行できるようになります。The sample application that you create with this guide enables a Windows Desktop application that queries the Microsoft Graph API or a web API that accepts tokens from a Microsoft identity-platform endpoint. このシナリオでは、Authorization ヘッダーを使用して HTTP 要求にトークンを追加します。For this scenario, you add a token to HTTP requests via the Authorization header. トークンの取得と更新は、Microsoft Authentication Library (MSAL) で処理されます。The Microsoft Authentication Library (MSAL) handles token acquisition and renewal.

保護された Web API にアクセスするためのトークン取得処理Handling token acquisition for accessing protected web APIs

ユーザーが認証されると、サンプル アプリケーションは、Microsoft Graph API または Microsoft ID プラットフォームによって保護されている Web API でのクエリに使用できるトークンを受け取ります。After the user is authenticated, the sample application receives a token you can use to query Microsoft Graph API or a web API that's secured by the Microsoft identity platform.

Microsoft Graph などの API では、特定のリソースへのアクセスを許可するためにトークンが必要になります。APIs such as Microsoft Graph require a token to allow access to specific resources. たとえば、トークンは、ユーザーのプロファイルの読み取り、ユーザーの予定表へのアクセス、メールの送信などに必要です。For example, a token is required to read a user’s profile, access a user’s calendar, or send email. アプリケーションでは、MSAL を使用してアクセス トークンを要求し、API スコープを指定することによってこれらのリソースにアクセスできます。Your application can request an access token by using MSAL to access these resources by specifying API scopes. このアクセス トークンは、保護されたリソースに対するすべての呼び出しで HTTP Authorization ヘッダーに追加されます。This access token is then added to the HTTP Authorization header for every call that's made against the protected resource.

アクセス トークンのキャッシュと更新は MSAL が管理するため、アプリケーションが管理する必要はありません。MSAL manages caching and refreshing access tokens for you, so that your application doesn't need to.

NuGet パッケージNuGet packages

このガイドでは、次の NuGet パッケージを使用します。This guide uses the following NuGet packages:

ライブラリLibrary 説明Description
Microsoft.Identity.ClientMicrosoft.Identity.Client Microsoft Authentication Library (MSAL.NET)Microsoft Authentication Library (MSAL.NET)

プロジェクトの設定Set up your project

このセクションでは、Windows デスクトップ .NET アプリケーション (XAML) に "Microsoft でサインイン" を統合して、トークンを必要とする Web API でクエリを実行できるようにする方法を示すために、新しいプロジェクトを作成します。In this section you create a new project to demonstrate how to integrate a Windows Desktop .NET application (XAML) with Sign-In with Microsoft so that the application can query web APIs that require a token.

このガイドで作成したアプリケーションには、グラフを呼び出すボタン、結果を画面に表示する領域、およびサインアウト ボタンが表示されます。The application that you create with this guide displays a button that's used to call a graph, an area to show the results on the screen, and a sign-out button.

注意

代わりにこのサンプルの Visual Studio プロジェクトをダウンロードすることもできます。Prefer to download this sample's Visual Studio project instead? プロジェクトをダウンロードしたら、構成手順に進んでサンプル コードを構成してから実行してください。Download a project, and skip to the Configuration step to configure the code sample before you execute it.

アプリケーションを作成するには、次の手順を実行します。To create your application, do the following:

  1. Visual Studio で、 [ファイル] > [新規] > [プロジェクト] の順に選択します。In Visual Studio, select File > New > Project.
  2. [テンプレート][Visual C#] を選択します。Under Templates, select Visual C#.
  3. 使用している Visual Studio バージョンに応じて、 [WPF アプリ (.NET Framework)] を選択します。Select WPF App (.NET Framework), depending on the version of Visual Studio version you're using.

プロジェクトに MSAL を追加するAdd MSAL to your project

  1. Visual Studio で、 [ツール] > [NuGet パッケージ マネージャー] > [パッケージ マネージャー コンソール] の順に選択します。In Visual Studio, select Tools > NuGet Package Manager> Package Manager Console.

  2. [パッケージ マネージャー コンソール] ウィンドウで、次の Azure PowerShell コマンドを貼り付けます。In the Package Manager Console window, paste the following Azure PowerShell command:

    Install-Package Microsoft.Identity.Client -Pre
    

    注意

    このコマンドを実行すると、Microsoft Authentication Library がインストールされます。This command installs the Microsoft Authentication Library. MSAL は、Azure Active Directory v2.0 で保護される API へのアクセスで使用するユーザー トークンの取得、キャッシュ、更新を処理しますMSAL handles acquiring, caching, and refreshing user tokens that are used to access the APIs that are protected by Azure Active Directory v2.0

アプリケーションの登録Register your application

2 つのどちらかの方法でアプリケーションを登録できます。You can register your application in either of two ways.

オプション 1: 簡易モードOption 1: Express mode

次の手順を実行すると、アプリケーションをすばやく登録できます。You can quickly register your application by doing the following:

  1. Azure portal のアプリの登録クイックスタート エクスペリエンスに移動します。Go to the Azure portal - App registrations quickstart experience.
  2. アプリケーションの名前を入力し、 [登録] を選択します。Enter a name for your application and select Register.
  3. 画面の指示に従ってダウンロードし、1 回クリックするだけで、新しいアプリケーションが自動的に構成されます。Follow the instructions to download and automatically configure your new application with just one click.

オプション 2:詳細設定モードOption 2: Advanced mode

アプリケーションを登録し、ソリューションにアプリケーション登録情報を追加するには、次の手順を実行します。To register your application and add your application registration information to your solution, do the following:

  1. Azure portal にサインインします。Sign in to the Azure portal.

  2. 複数のテナントにアクセスできる場合は、トップ メニューの [ディレクトリとサブスクリプション] フィルター を使用して、アプリケーションを登録するテナントを選択します。

  3. Azure Active Directory を検索して選択します。Search for and select Azure Active Directory.

  4. [管理][アプリの登録] > [新規登録] の順に選択します。Under Manage, select App registrations > New registration.

  5. アプリケーションの 名前 を入力します (例: Win-App-calling-MsGraph)。Enter a Name for your application, for example Win-App-calling-MsGraph. この名前は、アプリのユーザーに表示される場合があります。また、後で変更することができます。Users of your app might see this name, and you can change it later.

  6. [サポートされているアカウントの種類] セクションで、 [Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)](任意の組織ディレクトリ (任意の Azure AD ディレクトリ - マルチテナント) 内のアカウントと、個人用の Microsoft アカウント (Skype、Xbox など)) を選択します。In the Supported account types section, select Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox).

  7. [登録] を選択します。Select Register.

  8. [管理] で、 [認証] > [プラットフォームの追加] の順に選択します。Under Manage, select Authentication > Add a platform.

  9. [モバイル アプリケーションとデスクトップ アプリケーション] を選択します。Select Mobile and desktop applications.

  10. [リダイレクト URI] セクションで、 https://login.microsoftonline.com/common/oauth2/nativeclient を選択します。In the Redirect URIs section, select https://login.microsoftonline.com/common/oauth2/nativeclient.

  11. [構成] をクリックします。Select Configure.

  12. Visual Studio に移動し、App.xaml.cs ファイルを開き、以下のコード スニペットの Enter_the_Application_Id_here を、登録してコピーしたアプリケーション ID に置き換えます。Go to Visual Studio, open the App.xaml.cs file, and then replace Enter_the_Application_Id_here in the code snippet below with the application ID that you just registered and copied.

    private static string ClientId = "Enter_the_Application_Id_here";
    

MSAL を初期化するコードの追加Add the code to initialize MSAL

この手順では、トークンの処理など MSAL ライブラリとのやり取りを処理するクラスを作成します。In this step, you create a class to handle interaction with MSAL, such as handling of tokens.

  1. App.xaml.cs ファイルを開き、クラスに MSAL の参照を追加します。Open the App.xaml.cs file, and then add the reference for MSAL to the class:

    using Microsoft.Identity.Client;
    
  2. App クラスを以下のように更新します。Update the app class to the following:

    public partial class App : Application
    {
        static App()
        {
            _clientApp = PublicClientApplicationBuilder.Create(ClientId)
                .WithAuthority(AzureCloudInstance.AzurePublic, Tenant)
                .Build();
        }
    
        // Below are the clientId (Application Id) of your app registration and the tenant information.
        // You have to replace:
        // - the content of ClientID with the Application Id for your app registration
        // - the content of Tenant by the information about the accounts allowed to sign-in in your application:
        //   - For Work or School account in your org, use your tenant ID, or domain
        //   - for any Work or School accounts, use `organizations`
        //   - for any Work or School accounts, or Microsoft personal account, use `common`
        //   - for Microsoft Personal account, use consumers
        private static string ClientId = "0b8b0665-bc13-4fdc-bd72-e0227b9fc011";
    
        private static string Tenant = "common";
    
        private static IPublicClientApplication _clientApp ;
    
        public static IPublicClientApplication PublicClientApp { get { return _clientApp; } }
    }
    

アプリケーション UI を作成するCreate the application UI

このセクションでは、アプリケーションで、Microsoft Graph のような保護されたバックエンド サーバーに対してクエリを実行する方法を示します。This section shows how an application can query a protected back-end server such as Microsoft Graph.

MainWindow.xaml ファイルは、プロジェクト テンプレートの一部として自動的に作成されます。A MainWindow.xaml file should automatically be created as a part of your project template. このファイルを開き、アプリケーションの <Grid> ノードを次のコードに置き換えます。Open this file, and then replace your application's <Grid> node with the following code:

<Grid>
    <StackPanel Background="Azure">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
            <Button x:Name="CallGraphButton" Content="Call Microsoft Graph API" HorizontalAlignment="Right" Padding="5" Click="CallGraphButton_Click" Margin="5" FontFamily="Segoe Ui"/>
            <Button x:Name="SignOutButton" Content="Sign-Out" HorizontalAlignment="Right" Padding="5" Click="SignOutButton_Click" Margin="5" Visibility="Collapsed" FontFamily="Segoe Ui"/>
        </StackPanel>
        <Label Content="API Call Results" Margin="0,0,0,-5" FontFamily="Segoe Ui" />
        <TextBox x:Name="ResultText" TextWrapping="Wrap" MinHeight="120" Margin="5" FontFamily="Segoe Ui"/>
        <Label Content="Token Info" Margin="0,0,0,-5" FontFamily="Segoe Ui" />
        <TextBox x:Name="TokenInfoText" TextWrapping="Wrap" MinHeight="70" Margin="5" FontFamily="Segoe Ui"/>
    </StackPanel>
</Grid>

MSAL を使用して Microsoft Graph API のトークンを取得するUse MSAL to get a token for the Microsoft Graph API

このセクションでは、MSAL を使用して Microsoft Graph API のトークンを取得します。In this section, you use MSAL to get a token for the Microsoft Graph API.

  1. MainWindow.xaml.cs ファイルで、クラスに MSAL の参照を追加します。In the MainWindow.xaml.cs file, add the reference for MSAL to the class:

    using Microsoft.Identity.Client;
    
  2. MainWindow クラス コードを次のコードに置き換えます。Replace the MainWindow class code with the following:

    public partial class MainWindow : Window
    {
        //Set the API Endpoint to Graph 'me' endpoint
        string graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";
    
        //Set the scope for API call to user.read
        string[] scopes = new string[] { "user.read" };
    
    
        public MainWindow()
        {
            InitializeComponent();
        }
    
      /// <summary>
        /// Call AcquireToken - to acquire a token requiring user to sign-in
        /// </summary>
        private async void CallGraphButton_Click(object sender, RoutedEventArgs e)
        {
            AuthenticationResult authResult = null;
            var app = App.PublicClientApp;
            ResultText.Text = string.Empty;
            TokenInfoText.Text = string.Empty;
    
            var accounts = await app.GetAccountsAsync();
            var firstAccount = accounts.FirstOrDefault();
    
            try
            {
                authResult = await app.AcquireTokenSilent(scopes, firstAccount)
                    .ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                // A MsalUiRequiredException happened on AcquireTokenSilent.
                // This indicates you need to call AcquireTokenInteractive to acquire a token
                System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
    
                try
                {
                    authResult = await app.AcquireTokenInteractive(scopes)
                        .WithAccount(accounts.FirstOrDefault())
                        .WithPrompt(Prompt.SelectAccount)
                        .ExecuteAsync();
                }
                catch (MsalException msalex)
                {
                    ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
                }
            }
            catch (Exception ex)
            {
                ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
                return;
            }
    
            if (authResult != null)
            {
                ResultText.Text = await GetHttpContentWithToken(graphAPIEndpoint, authResult.AccessToken);
                DisplayBasicTokenInfo(authResult);
                this.SignOutButton.Visibility = Visibility.Visible;
            }
        }
        }
    

詳細情報More information

ユーザー トークンを対話形式で取得するGet a user token interactively

AcquireTokenInteractive メソッドを呼び出すと、ユーザーにサインインを求めるウィンドウが表示されます。Calling the AcquireTokenInteractive method results in a window that prompts users to sign in. 通常、アプリケーションは、ユーザーが保護されたリソースに初めてアクセスするときに、対話形式でユーザーにサインインを求めます。Applications usually require users to sign in interactively the first time they need to access a protected resource. また、自動でのトークンの取得に失敗した場合 (ユーザーのパスワードが期限切れになっている場合など) にも、ユーザーはサインインする必要があります。They might also need to sign in when a silent operation to acquire a token fails (for example, when a user’s password is expired).

ユーザー トークンを自動で取得するGet a user token silently

AcquireTokenSilent メソッドは、ユーザーの操作なしでトークンの取得と更新を処理します。The AcquireTokenSilent method handles token acquisitions and renewals without any user interaction. AcquireTokenInteractive が初めて実行された後、以降の呼び出しでは、保護されたリソースへのアクセスに使用するトークンを取得する際に、通常は AcquireTokenSilent メソッドを使用します。トークンを要求または更新する呼び出しが自動で行われるからです。After AcquireTokenInteractive is executed for the first time, AcquireTokenSilent is the usual method to use to obtain tokens that access protected resources for subsequent calls, because calls to request or renew tokens are made silently.

最終的に、AcquireTokenSilent メソッドは失敗します。Eventually, the AcquireTokenSilent method will fail. この失敗は、ユーザーがサインアウトしたか、別のデバイスでパスワードを変更したことが原因と考えられます。Reasons for failure might be that the user has either signed out or changed their password on another device. ユーザーの操作によって解決できる問題が MSAL によって検出された場合、MSAL は MsalUiRequiredException 例外を発行します。When MSAL detects that the issue can be resolved by requiring an interactive action, it fires an MsalUiRequiredException exception. アプリケーションでは、この例外を 2 つの方法で処理できます。Your application can handle this exception in two ways:

  • すぐに AcquireTokenInteractive を呼び出します。It can make a call against AcquireTokenInteractive immediately. この呼び出しにより、ユーザーにサインインを求めます。This call results in prompting the user to sign in. ユーザーが使用できるオフライン コンテンツがないオンライン アプリケーションでは、通常、このパターンを使用します。This pattern is usually used in online applications where there is no available offline content for the user. このガイド付きセットアップで生成されるサンプルでは、このパターンを使用します。サンプルの初回実行時に、実際の動作を確認できます。The sample generated by this guided setup follows this pattern, which you can see in action the first time you execute the sample.

  • アプリケーションはユーザーによって使用されたことがないため、PublicClientApp.Users.FirstOrDefault() には null 値が含まれ、MsalUiRequiredException 例外がスローされます。Because no user has used the application, PublicClientApp.Users.FirstOrDefault() contains a null value, and an MsalUiRequiredException exception is thrown.

  • サンプルのコードでは、AcquireTokenInteractive を呼び出してユーザーにサインインを求めることにより、この例外を処理します。The code in the sample then handles the exception by calling AcquireTokenInteractive, which results in prompting the user to sign in.

  • 対話形式でのサインインが必要であることをユーザーに視覚的に示すことで、ユーザーが適切なタイミングでサインインできるようにします。It can instead present a visual indication to users that an interactive sign-in is required, so that they can select the right time to sign in. または、アプリケーションが後で AcquireTokenSilent を再試行します。Or the application can retry AcquireTokenSilent later. アプリケーションでオフライン コンテンツを使用できる場合など、ユーザーが中断なしでアプリケーションの他の機能を使用できる場合に、このパターンがよく使用されます。This pattern is frequently used when users can use other application functionality without disruption--for example, when offline content is available in the application. この場合、保護されたリソースにアクセスしたり、古くなった情報を更新したりするために、サインインするタイミングをユーザーが決定できます。In this case, users can decide when they want to sign in to either access the protected resource or refresh the outdated information. また、一時的に使用できなくなっていたネットワークが回復したときに、アプリケーションが AcquireTokenSilent の再試行を決定することもできます。Alternatively, the application can decide to retry AcquireTokenSilent when the network is restored after having been temporarily unavailable.

取得したトークンを使用して Microsoft Graph API を呼び出すCall the Microsoft Graph API by using the token you just obtained

次の新しいメソッドを MainWindow.xaml.cs に追加します。Add the following new method to your MainWindow.xaml.cs. このメソッドは、Authorize ヘッダーを使用した Graph API に対する GET 要求の実行に使用されます。The method is used to make a GET request against Graph API by using an Authorize header:

/// <summary>
/// Perform an HTTP GET request to a URL using an HTTP Authorization header
/// </summary>
/// <param name="url">The URL</param>
/// <param name="token">The token</param>
/// <returns>String containing the results of the GET operation</returns>
public async Task<string> GetHttpContentWithToken(string url, string token)
{
    var httpClient = new System.Net.Http.HttpClient();
    System.Net.Http.HttpResponseMessage response;
    try
    {
        var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
        //Add the token in Authorization header
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
        response = await httpClient.SendAsync(request);
        var content = await response.Content.ReadAsStringAsync();
        return content;
    }
    catch (Exception ex)
    {
        return ex.ToString();
    }
}

保護された API に対する REST 呼び出しの実行についての詳細More information about making a REST call against a protected API

このサンプル アプリケーションでは、GetHttpContentWithToken メソッドを使用して、トークンが必要な保護されたリソースに対して HTTP GET 要求を実行し、呼び出し元にその内容を返します。In this sample application, you use the GetHttpContentWithToken method to make an HTTP GET request against a protected resource that requires a token and then return the content to the caller. このメソッドは、取得したトークンを HTTP Authorization ヘッダーに追加します。This method adds the acquired token in the HTTP Authorization header. このサンプルで使用するリソースは、ユーザーのプロファイル情報を表示する Microsoft Graph API me エンドポイントです。For this sample, the resource is the Microsoft Graph API me endpoint, which displays the user's profile information.

ユーザーをサインアウトさせるメソッドを追加するAdd a method to sign out a user

ユーザーをサインアウトさせるには、次のメソッドを MainWindow.xaml.cs ファイルに追加します。To sign out a user, add the following method to your MainWindow.xaml.cs file:

/// <summary>
/// Sign out the current user
/// </summary>
private async void SignOutButton_Click(object sender, RoutedEventArgs e)
{
    var accounts = await App.PublicClientApp.GetAccountsAsync();

    if (accounts.Any())
    {
        try
        {
            await App.PublicClientApp.RemoveAsync(accounts.FirstOrDefault());
            this.ResultText.Text = "User has signed-out";
            this.CallGraphButton.Visibility = Visibility.Visible;
            this.SignOutButton.Visibility = Visibility.Collapsed;
        }
        catch (MsalException ex)
        {
            ResultText.Text = $"Error signing-out user: {ex.Message}";
        }
    }
}

ユーザーのサインアウトに関する詳細情報More information about user sign-out

SignOutButton_Click メソッドは、MSAL ユーザー キャッシュからユーザーを削除します。これは実質的に MSAL に現在のユーザーを忘れさせることになり、以降の要求が対話形式で行われる場合のみトークンの取得が成功します。The SignOutButton_Click method removes users from the MSAL user cache, which effectively tells MSAL to forget the current user so that a future request to acquire a token will succeed only if it is made to be interactive.

このサンプルのアプリケーションは単一ユーザーに対応していますが、MSAL は複数のアカウントで同時にサインインするシナリオをサポートしています。Although the application in this sample supports single users, MSAL supports scenarios where multiple accounts can be signed in at the same time. 例として、電子メール アプリケーションで 1 人のユーザーが複数のアカウントを持っている場合が挙げられます。An example is an email application where a user has multiple accounts.

基本的なトークン情報を表示するDisplay basic token information

トークンについての基本的な情報を表示するには、次のメソッドを MainWindow.xaml.cs ファイルに追加します。To display basic information about the token, add the following method to your MainWindow.xaml.cs file:

/// <summary>
/// Display basic information contained in the token
/// </summary>
private void DisplayBasicTokenInfo(AuthenticationResult authResult)
{
    TokenInfoText.Text = "";
    if (authResult != null)
    {
        TokenInfoText.Text += $"Username: {authResult.Account.Username}" + Environment.NewLine;
        TokenInfoText.Text += $"Token Expires: {authResult.ExpiresOn.ToLocalTime()}" + Environment.NewLine;
    }
}

詳細情報More information

Microsoft Graph API の呼び出しに使用するアクセス トークンに加えて、MSAL はユーザーのサインイン後に ID トークンも取得します。In addition to the access token that's used to call the Microsoft Graph API, after the user signs in, MSAL also obtains an ID token. このトークンには、ユーザー関連情報の少量のサブセットが含まれています。This token contain a small subset of information that's pertinent to users. DisplayBasicTokenInfo メソッドは、このトークンに含まれている基本的な情報を表示します。The DisplayBasicTokenInfo method displays the basic information that's contained in the token. たとえば、トークンの有効期限やアクセス トークンそのものを表す文字列に加えて、ユーザーの表示名や ID です。For example, it displays the user's display name and ID, as well as the token expiration date and the string representing the access token itself. [Call Microsoft Graph API](Microsoft Graph API の呼び出し) ボタンを複数回押すと、後の要求で同じトークンが再利用されてことが確認できます。You can select the Call Microsoft Graph API button multiple times and see that the same token was reused for subsequent requests. また、MSAL がトークンの更新時期だと判断したときに、有効期限が延長されることも確認できます。You can also see the expiration date being extended when MSAL decides it is time to renew the token.

コードのテストTest your code

Visual Studio で、お使いのプロジェクトを実行するには、F5 キーを押します。To run your project, in Visual Studio, select F5. 以下に示すように、アプリケーション MainWindow が表示されます。Your application MainWindow is displayed, as shown here:

アプリケーションのテスト

初めてアプリケーションを実行して [Call Microsoft Graph API](Microsoft Graph API の呼び出し) ボタンを選択すると、サインインを求められます。The first time that you run the application and select the Call Microsoft Graph API button, you're prompted to sign in. テストを行うには、Azure Active Directory アカウント (職場または学校のアカウント) または Microsoft アカウント (live.com、outlook.com) を使用します。Use an Azure Active Directory account (work or school account) or a Microsoft account (live.com, outlook.com) to test it.

アプリケーションにサインインする

アプリケーションに初めてサインインするときに、次に示すように、アプリケーションがプロファイルにアクセスし、サインインすることを許可することへの同意を求められます。The first time that you sign in to your application, you're also prompted to provide consent to allow the application to access your profile and sign you in, as shown here:

アプリケーションによるアクセスに同意する

アプリケーションの結果を表示するView application results

サインインしたら、Microsoft Graph API の呼び出しによって返されたユーザー プロファイル情報が表示されます。After you sign in, you should see the user profile information that's returned by the call to the Microsoft Graph API. 結果は、 [API Call Results](API コールの結果) ボックスに表示されます。The results are displayed in the API Call Results box. AcquireTokenInteractive または AcquireTokenSilent の呼び出しを介して取得されたトークンに関する基本情報は、 [Token Info](トークン情報) ボックスに表示されます。Basic information about the token that was acquired via the call to AcquireTokenInteractive or AcquireTokenSilent should be visible in the Token Info box. 結果には、以下のプロパティが含まれます。The results contain the following properties:

プロパティProperty FormatFormat 説明Description
ユーザー名Username user@domain.com ユーザーの識別に使用されているユーザー名。The username that is used to identify the user.
Token ExpiresToken Expires DateTimeDateTime トークンの有効期限が切れる時刻。The time at which the token expires. MSAL は、必要に応じてトークンを更新することで、有効期限日を延長します。MSAL extends the expiration date by renewing the token as necessary.

スコープと委任されたアクセス許可の詳細More information about scopes and delegated permissions

Microsoft Graph API には、ユーザーのプロファイルを読み取るための user.read スコープが必要です。The Microsoft Graph API requires the user.read scope to read a user's profile. このスコープは、アプリケーション登録ポータルで登録されたすべてのアプリケーションで、既定で自動的に追加されます。This scope is automatically added by default in every application that's registered in the Application Registration Portal. Microsoft Graph の他の API や、バックエンド サーバーのカスタム API には、追加のスコープが必要な場合があります。Other APIs for Microsoft Graph, as well as custom APIs for your back-end server, might require additional scopes. Microsoft Graph API には、ユーザーの予定表を表示するための Calendars.Read スコープが必要です。The Microsoft Graph API requires the Calendars.Read scope to list the user's calendars.

アプリケーションのコンテキストでユーザーの予定表にアクセスするには、Calendars.Read の委任されたアクセス許可をアプリケーション登録情報に追加します。To access the user's calendars in the context of an application, add the Calendars.Read delegated permission to the application registration information. 次に、Calendars.Read スコープを acquireTokenSilent 呼び出しに追加します。Then, add the Calendars.Read scope to the acquireTokenSilent call.

注意

スコープの数を増やすと、ユーザーは追加の同意を求められることがあります。The user might be prompted for additional consents as you increase the number of scopes.

ヘルプとサポートHelp and support

サポートが必要な場合、問題をレポートする場合、またはサポート オプションについて知りたい場合は、開発者向けのヘルプとサポートに関するページを参照してください。If you need help, want to report an issue, or want to learn about your support options, see Help and support for developers.

次の手順Next steps

保護された Web API を呼び出すデスクトップ アプリをビルドするには、複数のパートで構成される次のシナリオ シリーズを参照してください。Learn more about building desktop apps that call protected web APIs in our multi-part scenario series: