NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

Azure Active Directoryで簡単認証~自前でユーザー管理しよう Nativeアプリ 後編~

こんにちは、上坂です。
この記事はAzure Active Directoryについての連載記事になります。

前回の記事からずいぶん時間があいてしまいました、ごめんなさい・・・。前回、AccessTokenを取得したところまでやってみました。今回はいよいよGraphAPIを叩いてAzureAD内のユーザー情報を見てみることにしましょう。


GraphAPIを叩く方法は2つあります。1つはREST API、もうひとつはMicrosoftが公開しているライブラリを利用することです。 REST API を使う場合、Authorizationヘッダーに取得した AccessTokenをセットしてからリソースURIを叩きます。
今回はライブラリを使用しましょう。Azure Active Directory Graph Client Libraryというものです。

1.Azure Active Directory Graph Client Library
前回作成したコンソールアプリケーションに対して、インストールします。Nugetにて「GraphAPI」で検索するとワラワラと出てきますので、間違えないようにしてください。今回は.NET用のものを使用します。

 

f:id:nextscape_blog:20210909220816p:plain


それでは早速 REST APIを使ってAzureAD内のオブジェクトを抜き出してみましょう。AccessTokenの取得方法がわかっていれば超簡単です。この例では指定したディレクトリ内全てのユーザーについて、定義名と表示名をコンソールに表示しています。

 

ActiveDirectoryClient cl = new ActiveDirectoryClient(     new Uri("https://graph.windows.net/uesaka02.onmicrosoft.com"),     async () => await GetToken());
var
 u = cl.Users.ExecuteAsync();
u.Wait();
foreach (var item in u.Result.CurrentPage)
{
    Console.WriteLine("0}, {1}", item.UserPrincipalName,item.DisplayName);
}
Console.ReadLine();

 

ActiveDirectoryClientクラスのコンストラクタの第一引数に渡しているUriの「https://graph.windows.net/」の部分はGraphAPIを使う時の決まり事です。どのディレクトリのオブジェクトが欲しい場合でも同じです。それに続く「uesaka02.onmicrosoft.com」がどのディレクトリなのかを指定している部分になります。ご自分で作成されたディレクトリのドメインに変更してください。

コンストラクタの第二引数に渡している GetToken()は、AccessTokenを取得するためのメソッドの実行を指定しています。そう、前回実装しましたよね!前回の実装を非同期のメソッドに移動したのが GetTokenメソッドです。

 

static async Task<string> GetToken()
{
     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/"));

     var token = authRes.AccessToken;

     return token;
}

 

非同期メソッドとして実装する必要があるので、 async がついています。さて、では実行してみましょう!私の場合、実行結果は次のようになりました。

 

f:id:nextscape_blog:20210909220940p:plain


3件登録されていることがわかります。上の2件は過去の連載で作成したユーザーで、3件目はサブスクリプションの管理ユーザーです。とても簡単でしたね!・・・取得するだけなら。

ユーザーの作成と更新をするためには、このままだとできません。いや、APIを叩くことはできます。簡単です。APIを叩くだけだと、

Insufficient privileges to complete the operation.

というエラーメッセージとともに落ちます。アプリケーションに委譲してある権限を増やす必要があるのです。前回、管理ポータルでネイティブアプリーションとして登録しましたが、その時、権限付与しましたよね?あれです。

ユーザーの作成と更新をする場合は「Read and write directory data」にチェックをいれてください。

f:id:nextscape_blog:20210909221005p:plain

権限の変更は保存ボタンを押しても即時反映しませんのでご注意ください。5分ほど待てば、大丈夫のはずです。以下にユーザー作成とユーザー更新の実装例を掲載しておきます。

ユーザー作成の実装例:

 

ActiveDirectoryClient cl = new ActiveDirectoryClient(
    new Uri("https://graph.windows.net/uesaka02.onmicrosoft.com"),
    async () => await GetToken());
IUser userToBeAdded = new User(); userToBeAdded.DisplayName = " でもユーザー";
userToBeAdded.UserPrincipalName = 
"demoUser@uesaka02.onmicrosoft.com";
userToBeAdded.AccountEnabled = 
true;
userToBeAdded.PasswordProfile = 
new PasswordProfile
{
     Password = 
"T3vT3H5C",
     ForceChangePasswordNextLogin = 
true
 };
await cl.Users.AddUserAsync(userToBeAdded); 

ユーザー更新の実装例:

 

ActiveDirectoryClient cl = new ActiveDirectoryClient(
    new Uri("https://graph.windows.net/uesaka02.onmicrosoft.com"),
   
async () => await GetToken());
IUser forUpdate = await cl.Users.Where(m => m.UserPrincipalName.StartsWith("demoUser")).ExecuteSingleAsync();
forUpdate.DisplayName = 
"Takashi Uesaka";
await forUpdate.UpdateAsync(); 

 

あとは削除ですね。ユーザーを削除をする時は DeleteAsyncというメソッドを使用しますが、このDeleteAsyncメソッド、どんなに管理ポータルで権限をつけても権限不足で削除に失敗してしまいます。

削除はできないの?・・・いえ、できます。ただし、今回のように「ネイティブクライアントアプリケーション」では無く、「WebアプリケーションやWEB API」をAzureADに登録する必要があります。さらにPoweShellを使用して管理ポータルでは付与できない権限を付与しなければなりません。

ということは、言い換えるとWebアプリケーションでないとユーザーの削除ができない、と思ってしまいますが、そんなことはありません。ご安心を。

詳しくは次回やりましょう!