BEACHSIDE BLOG

Azure とか C# 好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Azure AD B2C のカスタム属性を Graph API で管理する (前編)

Azure AD B2C では、ユーザーの情報として Email や表示名、姓、名といったの一般的な Claim があります。それに加えて独自の Claim を追加することができます。
それがカスタム属性です。

Azure Portal からでは、カスタム属性を作成することがはきますが、ユーザーのカスタム属性の値の変更はできません(デフォルトで用意されている表示名とかの値は Azure Portal から変更できます)。

ということで今回は、Azure AD B2C のカスタム属性を Graph API でアクセスしたり変更したりするメモです。

具体的には AAD B2C へ C#、Console App でアクセスしてカスタム属性を操作します。

Web ブラウザとかでアクセスするなら AAD B2C にログインしてトークンをやりとりするのが普通ですね。ただ今回は画面が無いのでクライアントシークレットを使ってアクセスするものを作ります。
Web のバックグラウンド側で、アプリのシステム管理者のような人がユーザーのトークンに依存せずデータを取得・変更するようなユースケースの想定です。

Azure AD B2C のセットアップ

C# とは遠い話なので書きたくない Azure AD B2C のセットアップについて触れましょう。ここからは Azure Portal で作業します♪

テナントの作成

Azure Portal から Azure AD B2C のリソースを作成するだけです。以下のドキュメント通りです。

アプリの登録(プレビュー)の作成

次は、 アプリケーション登録をします。これは、雑に説明すると自身のアプリケーションが AAD B2C にアクセスした際にどんなことができるかを決めるところです。ひとことでいうとサービスプリンシパルですね(これ MS 用語?わかりにくいのかな...)。

Azure AD B2C の アプリの登録(プレビュー) をクリック > 新規登録 をクリックします。

f:id:beachside:20200402105802p:plain:w600

こんな感じで設定します。気にするポイントは、リダイレクト URI は後でユーザーフローを実行してトークンを確認するために https://jwt.ms にしたくらいでしょうか。
これで 登録 ボタンをクリックします。

f:id:beachside:20200402113742p:plain

登録したらこんな画面になりますので、認証 をクリックします。

f:id:beachside:20200402114046p:plain:w600

先ほど作成した内容に設定を変更できる画面です。ここでトークンのチェックを入れます。今回は ID トークン しか使いませんが個人的に必要なので両方にチェックを入れておきます。で、画面上部の 保存 をクリックします。

f:id:beachside:20200402115631p:plain

アプリの登録(プレビュー)> 証明書とシークレット

後で作成する Console アプリで使うので設定します。AAD B2C の 証明書とシークレット のメニューをクリックし、新しいクライアントシークレット をクリックしましょう。

f:id:beachside:20200402115947p:plain

作成のウインドウが表示されますので、名前と期限を任意に入力して 追加 をクリックします。シークレットの値が表示されますのでメモっておきましょう。リロードすると見えなくなります。

アプリの登録(プレビュー)> API のアクセスの許可

認証した際に受け取ったトークンを持っていることでどんなことができるかを定義します。

API のアクセス許可 をクリック > アクセス許可の追加 をクリックします。

f:id:beachside:20200402121148p:plain:w600

Microsoft APIMicrosoft Graph をクリックします。

f:id:beachside:20200402121255p:plain:w480

次の画面で アプリケーションの許可 をクリックします。
この状態で、画面のした方にある User の中の User.ReadWrite.All にチェックを入れて、画面の下の方にある アクセス許可の追加 をクリックして保存します。

今回は、Graph API でユーザーの情報を取得したり変更したりしたいのでこれを選びますが、変更したい項目次第でどれを選ぶかが細かく定義できますので、やりたいことがあるときはMS Graph のアクセス許可のドキュメントを確認しましょう。

f:id:beachside:20200402121414p:plain

アクセス許可の追加 をクリックするとこんな画面の状態になりますので、赤枠のボタンをクリックします。このボタンは権限がめちゃ強くないとクリックできないで、お仕事で使う際は権限を持っている人に依頼するケースが多いでしょう。

f:id:beachside:20200402121653p:plain

カスタム属性を追加

カスタム属性は、Azure AD B2C でデフォルトで用意されている email や姓、名、表示名の他で自身で独自に設定したい属性を定義したい場合に使います。詳しくはこちら

先ほどまでは AAD B2C の アプリの登録(プレビュー)の中の設定をしてましたが、ここからは AAD B2C の設定に戻ります。
慣れてないとメニューどこ?ってなるところですが、まずは アプリの登録(プレビュー) の中から離脱するのにここら辺をクリックします。

f:id:beachside:20200402124151p:plain:w480

では追加しましょう。 AAD B2C 自体のメニューにて ユーザー属性 をクリック > 追加 をクリックします。

f:id:beachside:20200402122345p:plain:w480

追加をクリックするとウインドウが表示されますのでカスタム属性を追加しましょう。今回は、適当に Tenant という属性を追加しました。データ型は文字列です。

ユーザーフローの作成

ユーザーフローは、サインインにどの IdP ( Google などの SNS や特定の AD とか)を使うかや、どの Claim を返すか、サインインのみまたはサインアップもさせるとかとかです。詳しくはこちら

作成するには、Azure AD B2C の ユーザーフロー をクリック > 新しいユーザーフロー をクリックします。

[f:id:beachside:20200402175115p:plain:600]

サインアップとサインイン をクリックします。プレビューのタブを開いて他に色んなフローがあったりするので真面目にやるときはちゃんと見ましょう。

f:id:beachside:20200402174913p:plain

設定する内容は下図の通りですでこんな感じ。

  1. 名前を適当に入れます。場合によってはプログラム側で使いますが今回は気にする必要なしかな。
  2. ID プロバイダーは今回は Email signup にしましょう。事前に Google とか Facebook とか ID プロバイダーを登録しておくとここで選択できるようになります。
  3. "詳細を表示" をクリックすると 4 の画面が出てきます。
  4. ここは、"属性を収集する" の列はサインアップ時に何を入力させるかです。"要求を返す"の列はトークンに何を含めるかです。先ほど追加したカスタム属性である Tenant は両方チェック入れましょう。あとは適当です。
  5. OK をクリックするとこの画面の内容が保存されます。
  6. 作成 をクリックして登録完了です。

f:id:beachside:20200402170732p:plain

これで準備完了なので、ユーザーフローを実行してトークンを取得してみましょう。今作成したユーザーフローをクリックします。

f:id:beachside:20200402181107p:plain

表示された画面でさっき設定した内容やログイン時のページとかいろいろカスタマイズできます。英語がいやだったら言語を日本語にしておきましょう。
とりあえず ユーザーフローを実行します をクリックしましょう。

f:id:beachside:20200402193312p:plain

以下の画面が表示されますので、

  • アプリケーション: 前述の アプリ登録(プレビュー)で作成したものを選択します。
  • 応答 URL: https://jwt.ms を選びます。これも前述の アプリ登録(プレビュー)で設定したものです。

ユーザーフローを実行します ボタンをクリックします。ログイン画面に遷移します。

f:id:beachside:20200402192505p:plain:w480

ログイン画面に遷移すると、ユーザーを登録していないのであれば、サインアップしましょう。
正しく設定されていれば、サインアップ時に Tenant の入力が求められます。

そしてサインインできたら jwt.ms の画面に遷移して設定した Tenant も表示されます。
表示では、Prefix として extension_ がつくので、extension_Tenant となります。プログラムでとるときはまたちょっと違うんですがね...

f:id:beachside:20200402194838p:plain

💊: サインアップ時に Tenant の入力がなかった場合は、ユーザー属性 を開いて、Tenant にチェックがついてることを確認しましょう。
💊: jwt.ms で Tenant の表示が無い場合は、アプリケーション要求 を開いて、Tenant にチェックがついてることを確認しましょう。簡単ですね。

f:id:beachside:20200402195525p:plain:w480

Console App の作成へ次回へ繰り越し!

これで AAD B2C の準備ができました。設定するのは一瞬だけどブログで書くとなげーわ....

次は、Console アプリで情報の取得と更新をしてみます。長くなったので次回にしましょう。

blog.beachside.dev

参考

docs.microsoft.com