アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

.NET Core 1. システムエンジニアリング Azure 実装技術

.NET Core: Azure Graph API SDKの使い方

投稿日:

Azure Graph API SDKを使用して、Azure AD B2Cのユーザアカウントを操作する方法を説明します。

概要

  • 将来的に、管理者ユーザが一般ユーザ(Azure AD B2Cユーザアカウント)の管理を行えるようなWebアプリを想定しています。ASP.NET Core 3.1で実装する想定です。
  • Azure AD/Azure AD B2Cのユーザアカウントを操作するためには、Microsoft Graphを使用する必要があります。これを使用するためのAPIとして提供されるMicrosoft Graph API SDKを使用します。
  • 今回は技術検証を目的としているため、ASP.NET Coreではなく、より実装が容易な.NET Core Console形態のプロジェクトを使用します。なお、Microsoft Graph API SDKの使い方は両者で変わりません。
  • 2020年9月現在の最新であるMicrosoft Graph v1.0を使用します。
  • 製品開発を想定しているので、品質や保守が不透明なpreview版は使用しません。

Microsoft Graphの概要

前提となる知識を簡単に説明します。

  • Microsoft Graphでできることは、公式サイトが分かりやすいと思います。
  • Microsoft GraphのAPI(RESTful API)を使用する方法(概要)は次の通りです。
    詳細は公式サイトをご覧ください。
    1. アクセストークンの取得
    2. リソースに対する操作の実行
  • アクセストークンの取得
    • Microsoft Identityプラットフォームを使用した認証を行う必要があります。
    • 認証に成功すると、認証の成功とアクセス権を示すアクセストークンが返却されます。
    • アプリケーションの認証・認可の要件に応じて、Microsoft Identityプラットフォームで使用する認証フローを選択する必要があります。選択可能認証フローは公式サイトをご覧ください。
  • リソースに対する操作の実行
    • ユーザアカウントやグループアカウント等の操作対象(リソース)を示すURLを指定し、操作内容に対応するHTTPメソッド(GET/POST/PUT/DELETE等)を実行します。
      https://graph.microsoft.com/v1.0/{resource}?[query_parameters]
    • リソースとして指定可能な対象は、Graph APIリファレンスの目次欄から参照できます。
    • Graph APIのトップURLを開くことで、実装されているリソースの一覧を取得することもできます。
  • Microsoft Graphを操作できる代表的なツールは次の通りです。

Azure Graph API SDKの使用方法

  • Microsoft GraphはRESTful APIであり、HTTPベースの操作が必要です。もう少し簡単に利用できるよう、各開発環境・言語用のライブラリがMicrosoft Graph API SDKとして提供されています。
  • Android, Angular, ASP.NET, iOS, javascript等の多くの開発環境・開発言語用のライブラリが提供されていますが、ここでは.NET Core向けのSDK(Microsoft.Graphパッケージ)を使用します。
  • 基本的な使用方法、認証フローを実装した認証プロバイダ、Microsoft Graphを実行するためのGraphサービスクライアントを使用して各種リソースに対する操作を実行します。
    var authProvider = new MyAuthProvider(); // 認証プロバイダ
    var graphServiceClient = new GraphServiceClient(authProvider); // クライアントの生成
    var result = graphServiceClient.Users.Request().GetAsync(); // ユーザ一覧を取得
    

認証プロバイダ

  • Microsoft Graph APIへのアクセス時、Graphサービスクライアントがアクセストークンを取得するために使用されるクラスです。
  • IAuthenticationProviderインターフェイスを実装したクラスを作成する必要があります。
    namespace Microsoft.Graph
    {
        public interface IAuthenticationProvider
        {
            Task AuthenticateRequestAsync(HttpRequestMessage request);
        }
    }
    

    クライアントがMicrosoft Graph APIにアクセスする際に、このインターフェイスのAuthenticateRequestAsync()メソッドが実行されます。
    このメソッドで、認証フローに応じたアクセストークの取得を行い、引数に渡されたHTTP要求にアクセストークンを設定する必要があります。(Microsoft Graphの仕様では、アクセス時のHTTP要求のAuthorizationヘッダにBearer形式でアクセストークンを設定する必要があります。

  • 公式サイトでは、IAuthenticationProviderを実装した認証プロバイダのパッケージとしてMicrosoft Graph .NET Authentication Provider Library(Microsoft.Graph.Auth)が紹介されています。しかしながら、preview版かつ正式リリースされる予定がないので、ここでは使用しません。
    The Microsoft Graph .NET Client Library does not currently include any default authentication implementations. There are set of preview authentication providers available in the msgraph-sdk-dotnet-auth repo.
  • 同公式サイトで紹介されているDelegateAuthenticationProviderを使用して、簡潔に認証プロバイダを実装することもできますが、ここではアクセストークンの取得方法を柔軟に変更できるよう、IAuthenticationProviderを独自に実装する方法を採用します。
  • Microsoft Identityプラットフォームでの認証にはMSALライブラリが推奨されています。後述のサンプルでは、MSALを使用してIAuthenticationProviderを実装します。

Graphサービスクライアント

Graph APIのユーザ等のオブジェクトがクラスとして定義されているので楽。
内部で上記と同様にREST要求を実行しているだけで、前述のGraph APIとできることはほとんど変わらない。

使用する際のポイントとしては、操作したいリソースの特定
ユーザ、グループ、カレンダー、等
https://docs.microsoft.com/ja-jp/graph/azuread-users-concept-overview?view=graph-rest-1.0

アクセストークンを取得するための認証プロバイダ(IAuthenticationProviderを実装したクラス)、
そのアクセストークンを使って要求を実行するためのクライアント(GraphServiceClientインスタンス)の生成が必要になります。

var graphServiceClient = new GraphServiceClient(authProvider)
result = graphServiceClient.{Resource}.Request.{Get/Add/Update/DeleteAsync()}

var authProvider
var client = new GraphServiceClient(authProvider);
var userResult = client.Users.Request.AddAsync(user);
var users = client.Users.Request.GetAsync();
var user = client.Users["id-of-user"].Request.GetAsync();
var 

認証プロバイダとして、MSのサイトではMicrosoft.Graph.Authが提供されていますが、これはPreviewなので使用しません。独自にIAuthProviderを実装し、MSALライブラリを使って認証します。これは、XXXにも記載されている方法であり、問題ないかと。
クライアントを生成する際に、上記の認証プロバイダを指定する必要があります。

Webアプリでユーザ管理を想定している。これは、ユーザの代理ではなく管理者権限を持ったアプリの権限で操作を行う想定なので、Client Credentialsフローを使用する前提で説明する。(MSALの認証の実装がちょっと変わってくる。)
サンプルは下記で公開している。

MSAL.NET を使用してクライアント アプリケーションを初期化する
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/msal-net-initializing-client-applications

https://docs.microsoft.com/ja-jp/graph/tutorials/aspnet-core

前提条件の登録
https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/microsoft-graph-get-started?tabs=app-reg-ga

APIのサンプル
https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/manage-user-accounts-graph-api

Build .NET Core apps with Microsoft Graph
https://docs.microsoft.com/en-us/graph/tutorials/dotnet-core
※Microsoft.Identity.Clientを使う指示がある適切な資料だと思われる。



(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-.NET Core, 1. システムエンジニアリング, Azure, 実装技術

執筆者:

関連記事

CentOS7のマルチホーム化

サイトの存在を隠しつつも、sftpサーバを公開し、後輩と1G以上のファイルのやりとりしたい。 パブリック側のIPアドレスを教えてしまうと、どこのサーバだろうかとブラウザで開いたりするとサイトの存在がわ …

ASP.NET Core: IHttpClientFactoryの検証用サンプル

本番環境ではあまり使うことはない、検証環境を想定したサンプルを紹介します。 本来のIHttpClientFactoryの使い方や基本的なサンプルは下記を参考にしていただければと思います。 ASP.NE …

Java正規表現によるパラメータ置換

mybatis-generatorが生成するクエリカスタマイズのために、生成されたクエリ上のパラメータを置換する方法を調べたので記載しておきます。 サンプルプログラム Java言語の場合、標準ライブラ …

.NET Core: JsonSerializerの単純な使い方

JsonSerializerの基本的な使い方とサンプルを説明します。 概要 .NET Core 3.1の標準パッケージSystem.Text.Jsonに含まれるJsonSerializerを使って、ク …

chromeのjavascriptを一時的に無効化

Webアプリの開発やテストで、クライアント側のバリデーションを無効にしてサーバ側バリデーションの動作確認する、等のように一時的にjavascriptを無効にしたい場合があります。これを実現するための方 …