こんにちは、上坂です。
この記事はAzure Active Directoryについての連載記事になります。
- 第1回 Azure Active Directory で簡単ユーザー認証
- 第2回 Azure Active Directoryで簡単認証~OpenIdConnect編~
- 第3回 Azure Active Directoryで簡単認証~多要素認証編(新規ユーザー作成時)~
- 第4回 Azure Active Directoryで簡単認証~多要素認証編(既存ユーザー設定時)~
ここまでのご紹介で気になることが1つ・・・いや、沢山あるとは思うのですがその中でも私なら最も気になるのが、ユーザー管理って結局Azure管理ポータル使う以外方法がないの?ということです。
自分たちが作ったアプリケーションなら別に気にしませんが、SIのようにお客様がユーザーを管理する場合は特に困ります。
ユーザーの新規登録やパスワードのリセットなど、管理ポータルでしか操作できないとなると、お客様は少なくともMSアカウントを作成して共同管理者として設定しなければなりません(組織アカウントを持っていない場合)。
そして管理ポータルには皆様御存知の通り沢山のAzureサービスが表示されている訳ですが、その中からAzureADのメニューを探し、何回もクリックしてようやくユーザー一覧にたどり着くわけです。
管理ポータルはユーザー管理専用な訳ではないのでこうなってしまうのは当たり前なんですが、こんな煩雑なやり方ではお客様の日々の運用に使っていただくわけにはいきません。やはり専用のユーザー管理画面を用意しなければ、という場合が多そうです。
そんな場合にはAzure Active Directory Graph APIを使いましょう。Azureではお馴染みのREST APIでユーザーの管理が可能です!
というわけで、今回はGraphAPIを使ったユーザー情報へのアクセスをやってみましょう。簡単です!
GraphAPIにアクセスする時、Webアプリかそうでないか(モバイルアプリやWinForm、WPFなどのNativeアプリ)、どちらからアクセスするかで少し異なります。今回はNativeアプリによるユーザー管理をやってみましょう。
Azure AD Graph API は REST なので、特に言語や環境を選びません。でも .NET ユーザーは Graph API のライブラリがあるのですごい楽ができます。今回もできるだけ簡単に実現したいのでこのライブラリを使います。
1.コンソールアプリケーションプロジェクトを作る
適当な名前をつけてコンソールアプリケーションプロジェクトを作成してください。
次に早速Graph API の ライブラリを・・・と言いたいところですが、その前にひとつ、知っておかなければならないことがあります。
それは、Graph API にアクセスするためには、 AccessToken という文字列が必要だ、ということです。ではこのAccessTokenとは一体何者で、どうやったら手に入れることができるのでしょうか。
・AccessTokenとは?
AccessTokenとは、AzureADが「あなたがリソースにアクセスすることを許可します!」ということを示す文字列です。リソースとは、今回の場合でいうと「GraphAPI」の「何か」になります。
「何か」の部分はオブジェクト(GraphAPIだったり、自分で作ってAzureADに登録したアプリだったり)によるのですが、GraphAPIの場合は、読み書き権限だったり、ディレクトリの参照権限だったりです。このAccessTokenをAzureADからもらうことで、GraphAPIにアクセスすることができます。
・AccessTokenはどうやって手にいれる?
AccessTokenを手に入れるためには、次の2つの条件が必要です。
- アプリケーションがAzureADに認可済みであること
- アプリケーションを通じてAzureADにアクセスするユーザーをAzureADに対して認証してもらうこと
それではこの2つを満たすように事前作業をしましょう。
2.AzureADに認証してもらってAccessTokenを手に入れる実装
と、その前に。Azure ADと認証してもらって、AccessTokenをもらう。これを実現するのにとても便利なライブラリがあります。Active Directory Authenticaion Libraryというもので、これを使うとものすごく簡単です! Nuget で導入します。Nugetの検索窓に「Active Diretory Authentication」と入力するとすぐ出てきます。インストールボタンをクリックし、インストールします。
次にAzureADに今作ったコンソールアプリケーションを登録します。ということはアプリケーションを登録しておく先のディレクトリが作成済みである必要があります。まだディレクトリを作成していない方は第2回を参照してディレクトリを作成しておいてください。そして2つの条件の2番目であるユーザーによる認証が必要になりますので、ユーザーを登録しておいてください。私の場合、以下の情報(第2回のやつです)でディレクトリを作成済みです。
- ディレクトリ:新しいディレクトリの作成
- 名前:OpenIdConnectDirectory
- ドメイン名:uesaka02
- 国/地域:日本
ディレクトリを選択し、メニューから「アプリケーション」クリックします。
下のメニューから「追加」クリックすると、ダイアログが立ち上がります。「組織で開発中のアプリケーションを追加」を選択します。
次から始まるウィザード画面でアプリケーションの情報を入力するのですが、重要なのはアプリケーションの「種類」です。それ以外は適当で良いです。私は次のように入力しました。
- 名前:MyNativeApp
- 種類:ネイティグアプリケーション
- リダイレクトURI:http://mynativeapp.com
レ点をチェックしてウィザードを完了すると、アプリケーションが登録されます。さきほど作ったコンソールアプリケーションに関する情報を全く登録しませんでしたね。そういうものでしょうか。はい、そういうものです。でもこれだと AzureAD 側はコンソールアプリケーションからの認証要求を正しい要求である、と判定することができません(悪いやつからの要求かもしれない)。それを判定するために、AzureADに対して認証を要求するときに次の二つの情報を送信する必要があります。
- クライアントID
- リダイレクトURI
クライアントIDはアプリケーションを登録すると自動生成されます。後ほど見に行きます。リダイレクトURIはさきほど入力したものです。適当でよいです、なんて書きましたが、それは本当にリダイレクトするためにエンドポイントをアプリケーション側に用意する必要はないからです。登録してあるURIと同じURIが送信されたことをチェックするために使用されます。ではクライアントIDを確認しましょう。メニューの「構成」をクリックします。まずは先ほど入力した「名前」と「リダイレクトURI」の間に「クライアントID」をメモっておいてください。
画面を下にスクロールすると、「他のアプリケーションに対するアクセス許可」という欄があります。既に「Windows Azure Active Directory」というアプリケーションが登録されていますが、これは GraphAPI のことです。ここで Graph API へのアクセスをここで許可しておくことで、自分が作ったアプリケーション(今回のコンソールアプリケーション)からGraph API にアクセスすることができるようになります。「デリゲートされたアクセス許可」ドロップダウンを展開して、次のようにチェックを入れておきましょう。
- チェック有り:Read directory data
- チェック無し:Read and write directory data
- チェック有り:Enable sign-on and read user's profiles
- チェック無し:Access your organization's directory
AzureAD 側の準備は以上になります。コンソールアプリケーションに戻って、次のソースを貼り付けてください。
using Microsoft.IdentityModel.Clients.ActiveDirectory;
class Program
{
static void Main(string[] args)
{ var authCtx = new AuthenticationContext("https://login.microsoftonline.com/common");
AuthenticationResult authRes = authCtx.AcquireToken(
"https://graph.windows.net",
"xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx", // ←自分のクライアントIDに書き換え
new Uri("http://mynativeapp.com/"));, // ←自分のリダイレクトURIに書き換え
var token = authRes.AccessToken;
Console.WriteLine(token);
Console.ReadLine();
}
}
ソースのコメントにある通り、クライアントIDとリダイレクトURIを変更してください。変更したら実行します。すると、認証のダイアログがポップアップするかと思います。
登録したユーザーでログインしてください。認証に成功すると画面に AccessToken が表示されるはずです。
ソースの説明は特に必要ないぐらい簡単ですね。AuthenticationContextクラスのAcquireTokenメソッドを叩くと認証ロジックが走るわけです。
これで AccessToken が取得できました。この AccessTokenを使って GraphAPIにアクセスすることができます。長くなったので次回にします!