C#: Graph API ユーザアカウント操作サンプル

概要

  • 管理者がAzure AD B2Cのユーザアカウントの管理が行えるASP.NET Coreのアプリの開発を想定している。Azure AD B2Cユーザアカウントの作成や更新等の操作はMicrosoft Graphを使用する必要があり、その技術調査としてサンプルを作成しました。
  • .NET CoreでMicrosoft Graphを操作するためのライブラリとして、Microsoft Graph API SDKが提供されているため、これを使用しています。(.NET Core用のMicrosoft.Graphパッケージを想定、Visul StudioのNuGetで利用可。)
  • Microsoft Graphの認証はMicrosoft Identityプラットフォームをベースにしています。
    前述の背景を踏まえ、今回はデーモンアプリのシナリオ(※1)を使用する前提でサンプルを作成しています。

    ※1: 使用する認証フローは「クライアント資格情報フロー」(Open ID Connect(OAuth2)の”client credentials flow”)となります。(認証対象はユーザではなくアプリケーション。)
  • 上記のクライアント資格情報フローを実装するために、Microsoft Identityプラットフォーム用ライブラリであるMicrosoft Authentication Library (MSAL)を使用します。
  • ユーザアカウントの作成・更新では、検証のために拡張属性・カスタム属性の更新も含めています。
    両者の違いについては、こちらをご覧ください。
  • 今回は技術検証を目的としているため、ASP.NET Coreではなく、より実装が容易な.NET Core Console形態のプロジェクトを使用しています。(Microsoft Graph API SDKの使い方は両者で変わりません。)
  • 2020年9月現在の最新であるMicrosoft Graph v1.0を使用します。
  • Azure AD B2Cのテナントは既に取得している前提のサンプルとなります。

実行環境の準備

こちらで紹介しています。

NDW

目次 1 概要2 実行環境の準備3 補足事項 概要 WebアプリからGraphAPIを使用してAzure AD B2C上…

サンプルコード

ユーザアカウントに対する一連の操作を順番に実行するサンプルとなります。
完全なコードは、こちらで公開しています。

プロジェクト構成

Graph APIを使用するためのパッケージの参照を追加します。

参考:
マイクロソフトのサイトにあるサンプルではMicrosoft.Graph.Authパッケージを使用しています。これはpreview版かつ公式リリース予定(GA)がないのでプロダクト環境向けには使用できません。その代替策として、Microsoft.Graph.Authパッケージと同様に、MSAL.NET(Microsoft.Identity.Clientパッケージ)を使用して認証を実装します。

メイン

トークンの取得から始まり、ユーザアカウントの作成、更新、削除を行います。
基本的には、GraphServiceClientを使用してユーザアカウントに対する各種操作を行います。
Microsoft Graphに対する認証を行うための認証プロバイダMyAuthProviderを生成し、GraphServiceClientに引き渡しています。

  • 2, 4行目: 前章で確認したGraphApiTestアプリのクライアントID、テナントIDを指定します。
  • 6行目: 前章で確認したシークレット値を指定します。
  • 8行目: 前章で確認したB2C拡張アプリのクライアントIDを指定します。
  • 11-14行目: 各所で使用する拡張属性の名称を定義しておきます。カスタム属性のプロパティ名に関しては、こちらをご覧ください。

認証プロバイダの実装

GraphServiceClientに対して認証機能を提供するクラス(認証プロバイダ)で、IAuthenticationProviderインターフェイスを実装する必要があります。
GraphServiceClientがMicrosoft Graphにアクセスする際、AuthenticateRequestAsync()が実行されます。このメソッドの中でアクセストークンの取得や、メソッド引数のHTTP要求に対して認証情報を設定する必要があります。

  • 1行目: IAuthenticationProviderインターフェイスを実装します。
  • 13-17, 23行目: 前述のようにクライアント資格情報フローを想定しており、アクセストークンの取得方法はMicrosoft Identity プラットフォームの資料を参考にしています。
  • 23行目: プロダクト環境での使用を想定する場合、要件に応じてトークン取得のリトライやトークンのキャッシング等の実装を推奨します。一部はMicrosoft.Graph.AuthのClientCredentialProviderの実装が参考になると思います。
  • 29-30行目: Microsoft Graphの認証仕様に合わせて、AuthorizationヘッダにBearer形式のアクセストークンを設定します。

ユーザアカウント一覧の取得

GraphServiceClientクライアントを使用して、ユーザアカウント一覧を取得します。

  • 8-16行目: Usersリソースを指定してGetAsync()を実行することで、ユーザアカウント一覧を取得できます。
    Select()で抽出する属性を定義しています。”ObjectId, DisplayName”等のように文字列でも指定できますが、間違える可能性があるので、この例のようにプロパティ名を指定することをお薦めします。ただし、後述のようにカスタム属性を指定する場合、文字列で指定する必要があります。
    (なお、名前を間違えてもエラーは発生せず値が取得できないだけです。)
  • 20-24行目: ユーザアカウントが多数ある場合、GetAsync()の実行では先頭の100件しか取得できません。後続のデータの有無の確認やその取得のために、NextPageRequestプロパティを使用しています。

ユーザアカウントの取得

指定したObjectIdのユーザアカウントを取得します。

  • 13-30行目: Users[ObjectId]で対象のユーザアカウントを指定して、GetAsync()を実行します。
    カスタム属性の値を取得する場合、現状のSDK APIの仕様では文字列で属性名を指定する必要があります。

ユーザアカウントの作成

Azureポータルでの作成時と同様の属性が設定されるようユーザアカウントを作成します。
参考として、サインインユーザ名、サインインメールアドレス、拡張属性・カスタム属性も設定するようにしています。

  • 60-62: Userオブジェクトのプロパティに属性値を指定し、Usersに対してPostAsync(User)を実行します。
    ユーザアカウント作成時の必須項目はDisplayName, UserPrincipalName, MailNickname, AccountEnabled, PasswordProfile.Passwordですが、これはAzureポータルで作成した場合と異なります。
  • 51行目: 拡張属性の値はUser.AdditionalDataプロパティ(Dictionary型)に格納します。カスタム属性のプロパティ名に関しては、こちらをご覧ください。

ユーザアカウントの更新

指定したObjectIdのユーザアカウントを更新します。
Azure AD B2C上でユーザアカウントを識別するためのキーとなるサインインユーザ名、サインインメールアドレス、プリンシパル名を変更することもできます。

  • 44-46: Userオブジェクトに変更したい属性値を格納します。Users[ObjectId]で更新対象のユーザアカウントを指定し、UpdateAsync(User)を実行します。
  • 36行目: 拡張属性の値はUser.AdditionalDataプロパティ(Dictionary型)に格納します。カスタム属性のプロパティ名に関しては、こちらをご覧ください。

ユーザアカウントの更新(パスワード更新)

ユーザアカウントのパスワードを更新します。
※ユーザアカウントのパスワード変更には、前述の通り追加の権限が必要となります。

ユーザアカウントの削除

ユーザアカウントを削除します。
※ユーザアカウントの削除には、前述の通り追加の権限が必要となります。

  • 4-6行目: Users[ObjectId]で対象のユーザアカウントを指定して、DeleteAsync()を実行します。

実行結果の例

参考ですが、実行結果は次のようになります。