LoginSignup
0
1

More than 5 years have passed since last update.

AADアプリケーションと認可サーバーを理解する(その1のおまけ。.NET Coreアプリケーションに改造)

Posted at

はじめに

別の記事、AADアプリケーションと認可サーバーを理解する(その1) からの派生記事です。

あちらの記事ではコンソールアプリケーションを.NET Framework向け(Windowsプラットフォームのみ。Windows環境のみ実行可能)としていましたが、この記事では.NET Core向け(クロスプラットフォーム対応。Windows環境、Linux環境、もしくはMac環境で実行可能)に書き換えて、その上で実際に実行してユーザー体験を確認します。

クロスプラットフォームということで、ちょっと面白い感じのユーザー体験になることが分かりました。

プロジェクトが.NET Framework向けか、.NET Core向けかの違い以外はAADアプリケーションと認可サーバーを理解する(その1) と内容は全く同じです。

.NET Core向けコンソールアプリケーションに変更する

変更後のプロジェクトファイルを以下に示します。

aad-client-console.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RootNamespace>aad_client_console</RootNamespace>
  </PropertyGroup>

    <ItemGroup>
    <PackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="[3.19.3,4)" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
    <PackageReference Include="System.Net.Http" Version="4.3.3" />
  </ItemGroup>

</Project>

変更箇所は1か所だけです。<TargetFramework>タグの値がnet47からnetcoreapp2.1になっただけです。

次にProgram.csがどのように変更されたか見てみましょう。

Program.cs
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

namespace aad_client_console
{
    class Program
    {
        static void Main(string[] args)
        {
            var authContext = new AuthenticationContext("https://login.microsoftonline.com/あなたのテナント名.onmicrosoft.com");

            var codeResult = authContext.AcquireDeviceCodeAsync("https://graph.microsoft.com/", "b0905193...で始まるGUID").Result;
                Console.ResetColor();
                Console.WriteLine("You need to sign in.");
                Console.WriteLine("Message: " + codeResult.Message + "\n");

            var authResult = authContext.AcquireTokenByDeviceCodeAsync(codeResult).Result;

            Console.WriteLine("ID token: " + authResult.IdToken);
            Console.WriteLine("Access token: " + authResult.AccessToken);

            var request = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/v1.0/users?$filter=givenName eq 'Tsuyoshi'");
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);

            var client = new HttpClient();
            var response = client.SendAsync(request).Result;

            Console.WriteLine("User: " + response.Content.ReadAsStringAsync().Result);
        }
    }
}

ここではauthRequestの取得方法が

            var authResult = authContext.AcquireTokenAsync(
                    "https://graph.microsoft.com",
                    "b0905193...で始まるGUID",
                    new Uri("https://あなたのテナント名.onmicrosoft.com/my-aad-client-console"),
                    new PlatformParameters(PromptBehavior.Always)).Result;

から

            var codeResult = authContext.AcquireDeviceCodeAsync("https://graph.microsoft.com/", "b0905193...で始まるGUID").Result;
                Console.ResetColor();
                Console.WriteLine("You need to sign in.");
                Console.WriteLine("Message: " + codeResult.Message + "\n");

            var authResult = authContext.AcquireTokenByDeviceCodeAsync(codeResult).Result;

に変わりました。

特に興味深い点は、まずcodeResultというデータを取得して、そのデータのMessageプロパティをコンソールに表示しています。その内容は以下のようなものです。

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code B5YZPWJYR to authenticate.

メッセージは、認証するにはブラウザでhttps://microsoft.com/deviceloginに行って、B5YZPWJYRを入力せよ、と言っています。これはいったいどういうことでしょう?

このメッセージをコンソールに表示することで、ユーザーに任意のブラウザを使って認証を完了してくださいと指示する必要があるのです。

image.png

Windows環境依存の.NET Framework向けのアプリケーションの場合はポップアップウィンドウを利用してユーザー認証を行いましたが、.NET Core向けのアプリケーションの場合ポップアップウィンドウは使えません。ですから、ユーザーには、どのマシーンのどのブラウザでも構わないので、このコードを入力させることで認証ステップを完了させようとしているのです。ところでブラウザは、このコンソールアプリケーションが実行しているマシーン上で実行する必要はありません。手持ちのスマフォのブラウザを使うことも出来ます。

実際に、一連の認証の流れ(シナリオ)を見ていきましょう。

まずは、ブラウザにしてされたアドレスを入力して、ページをロードします。

image.png

コードの入力を求めているので、指示通りに入力します。

image.png

するとお馴染みのログインページがでました。ここでAAD認可サーバーに「認証」をしてもらいます。この段階で、アプリケーションがmy-aad-client-consoleであると明示されています。

image.png

「認証」が完了すると、my-aad-client-consoleへの認可も完了します。

image.png

ところで、コードはユーザーの認可サーバーとのやり取りを、以下のコードの位置で待っています。

var authResult = authContext.AcquireTokenByDeviceCodeAsync(codeResult).Result;

ユーザーの認証と認可が完了したので、晴れてauthResultに値が返され、IDトークンとアクセストークンを取得することができました。Microsoft Graph APIを利用するコードについては変更はありません。

以下、プログラムの出力です。

image.png

まとめ

AADアプリケーションと認可サーバーを理解する(その1) で解説したAAD側のAADアプリケーション・オブジェクトの設定そのままで、クライエントのアプリケーションをクロスプラットフォームにすることが出来ました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1