Microsoft Graph を ASP.NET MVC Web アプリに統合する

完了

このユニットでは、Microsoft Graph から取得したデータを要求し統合するために、ASP.NET MVC Web アプリケーションのカスタマイズと構成を行う方法を説明します。

ASP.NET MVC Web アプリケーションで Microsoft Graph を統合する

ASP.NET MVC Web アプリケーションへの Microsoft Graph サポートの追加は簡単に行うことができます。 Microsoft Graph .NET SDK は、NuGet パッケージの Microsoft Graph を介して配布されています。

Microsoft Graph のアクセス トークンを取得する

Microsoft Graph をとのすべての通信は、GraphServiceClient で処理されます。 GraphServiceClient は、各要求にアクセス トークンが含まれるように構成する必要があります。 そのため、Web アプリケーションの最初の手順として、ユーザーがサインインしたときにアクセス トークンを取得します。 これは、アクセス トークンの取得方法を示す次のコードを使用して行うことができます。

public async Task<string> GetUserAccessTokenAsync()
{
  var idClient = ConfidentialClientApplicationBuilder.Create(appId)
      .WithRedirectUri(redirectUri)
      .WithClientSecret(appSecret)
      .Build();

  var tokenStore = new SessionTokenStore(idClient.UserTokenCache,
          HttpContext.Current, ClaimsPrincipal.Current);

  var accounts = await idClient.GetAccountsAsync();

  // By calling this here, the token can be refreshed
  // if it's expired right before the Graph call is made
  var result = await idClient.AcquireTokenSilent(graphScopes, accounts.FirstOrDefault())
      .ExecuteAsync();

  return result.AccessToken;
}

このメソッドでは、まず OAuth 2 プロトコル仕様で定義された機密性の高いクライアントのインスタンスを作成します。 機密性の高いクライアントとは、アプリケーションのユーザーに公開されることのない、アプリ ID とシークレットを持つクライアントのことです。 別の種類であるパブリック クライアントは、モバイル アプリやデスクトップ アプリで使用します。アプリ シークレットは、アプリの実行可能なコードを使ってユーザーのモバイル デバイスやデスクトップに配布する必要があるためです。

機密性の高いクライアントは、登録されているアプリの ID、シークレット、Microsoft ID で正常にサインインすることでユーザーが送信されるよう構成されたリダイレクト URI を使用して作成されます。

次に、コードは現在のユーザーへの参照を取得し、AcquireTokenSilent() メソッドを使ってトークン ストアから既に入手しているアクセス トークンの取得を試みます。 AcquireTokenSilent() メソッドが失敗した場合には、ユーザーに対話形式のログインについて示されます。

アプリケーションでアクセス トークンを取得できたら、次の手順に進み、GraphServiceClient のインスタンスを作成します。

構成済みの GraphServiceClient のインスタンスを作成する

アプリケーションで Microsoft Graph のアクセス トークンを取得できたら、GraphServiceClient の新しいインスタンスを作成し、Microsoft Graph に送信された各要求にアクセス トークンを含めるように次のコードのとおり構成します。

public static GraphServiceClient GetAuthenticatedClient()
{
    DelegateAuthenticationProvider provider = new DelegateAuthenticationProvider(
        async (requestMessage) => {
            string accessToken = await GetUserAccessTokenAsync();
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
        });

    GraphServiceClient graphClient = new GraphServiceClient(provider);

    return graphClient;
}

GraphServiceClient のコンストラクターには、単一のパラメーターとしての認証プロバイダーを想定しています。 このメソッドでは、新しい HTTP 要求が送信されたときにアクセス トークンを取得するように構成されている DelegateAuthenticationProvider のインスタンスを作成します。 アクセス トークンを取得したら、HTTP 要求を、HTTP 認証 ヘッダーとアクセス トークンの値も含めるように変更します。

これにより、Microsoft Graph への各要求にアクセス トークンが追加されます。

エンドユーザーのエクスペリエンス

エンドユーザー アプリケーションのエクスペリエンス

エンドユーザーのエクスペリエンスはどのようになりますか?

ユーザーはまずサインインするように求められ、Microsoft ID サインイン ページにリダイレクトされます。 Web アプリケーションを使用して初めてサインインする段階では、Microsoft Graph へのアプリケーションのアクセス許可はまだ付与されていません。 ユーザーがまだ同意していない新しいアクセス許可が要求されている可能性があります。

この場合は、アプリに同意するようユーザーに求めるメッセージが表示されます。 最後に、サインインが成功したら、ユーザーは ASP.NET MVC アプリケーションにリダイレクトされます。Microsoft Graph .NET SDK を使用して取得した予定表から、ユーザー イベントが表示されます。

アプリケーション エクスペリエンスの概要

アプリケーションの概要

アプリケーションの概要を見てみましょう。

まず、ユーザーは Web アプリケーションにサインインする必要があることが知らされます。 Web アプリにより、Microsoft ID サインイン ページにリダイレクトされます。 Microsoft ID によりユーザーが認証されると、前述した同意のエクスペリエンスを経て、ASP.NET MVC Web アプリに戻るようリダイレクトされます。

リダイレクトには、認証コードが含まれます。 認証コードは Web アプリに付与され、このコードを使用して、Web アプリが Microsoft ID からアクセス トークンを要求します。 この要求はサーバー側から送信され、前述の ConfidentialClient を使って実行されます。 Web アプリがアクセス トークンを取得したら、Microsoft Graph を呼び出し、.NET SDK を使用してすべての予定表アイテムを取得します。

OAuth v2 認証コード付与のフローの概要

OAuth v2 認証コード付与のフロー

次のユニットに進む前に、アクセス トークンを取得してから OAuth v2 認証コード付与のフローがどのように動作するかを確認します。 上の図は、左側が ASP.NET MVC アプリケーションからのプロセス全体の概要 (認定とトークン取得のための 2 つの Microsoft ID v2 エンドポイント)、右側が最終的な Microsoft Graph の概要を示しています。

一度アクセス トークンを取得すれば、アクセス トークンを再び取得するための手順を実行しなくても、アプリケーションから Microsoft Graph を呼び出すことができます。 代わりに、Web アプリケーションはアクセス トークンをローカルにキャッシュし、トークンの有効期限がいずれ切れるまで使い続けます。

この場合、更新トークンを使用して、ユーザーが再度サインインしなくても、新しいアクセス トークンを取得できます。 何が行われているかを理解するのは重要なので、これは MSAL ライブラリを使う利点の 1 つです。MSAL ライブラリはこのトークンのキャッシュと、必要に応じてトークンの更新を行います。

コードは、トークンをサイレント取得するための単純なパターンに従います。 エラーが発生した場合は、取得できるようアプリケーションが対話形式でユーザーに指示します。 トークンのサイレント取得とは、MSAL によりまずキャッシュからトークンを取得すること、またはトークンの有効期限が切れている場合はトークンを更新することによりトークンの取得を試みることを意味しています。

概要

このユニットでは、Microsoft Graph から取得したデータを要求し統合するように、ASP.NET MVC Web アプリケーションのカスタマイズと構成を行う方法について説明しました。