はまったりひらめいたり…とか…

Angularや.NETやAzureやその他色々。

Azure AD(v2.0)の認証をWPF(.NET Core)とASP.NET Core WebAPIで使用しようとしてハマった話

はじめに

下記の構成で構築しています。

一部Previewを使用していることもあり

参照されるタイミングによっては掲載するソースコードで動作しない可能性がありますので

ご注意くださいませ。

やりたいこと

  • WPF(.NET Core製)アプリで認証してトークンを取得し、WebAPIと通信したい
  • AzureAD Application(v2.0)を使用して認証したい

基本そこまで難しいことはないというか、下記のドキュメントままなのですが

github.com

一部ハマったポイントがあるので備忘録的にメモを落としておきます。

1. AzureAD Application(v2.0)について

f:id:TakasDev:20200506154256p:plain

検証時点は個人アカウント(outlook)を使用するので👆画像を選択

この場合、ADアプリケーションのバージョンは強制的に2.0となります。

ここを設定しない場合は、Manifestの「accessTokenAcceptedVersion」を指定する必要があります。

f:id:TakasDev:20200506155823p:plain

2. トークン取得時に失敗する事象について

AuthenticationResult result = await _app.AcquireTokenInteractive(Scopes).ExecuteAsync();

アクセストークンの取得は上記の処理で行います。

しかし、このコードの実行の際に👇のエラーが発生しハマってしまいました。

AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'

暗黙フローを使用してトークンを取得するつもりだったので、シークレットを使用する余地もなく「?」な感じだったのですが

GitHubのIssueに同一のエラーが報告されていました。

ドキュメント曰く

Azure ADアプリケーションの「allowPublicClient」を「true」に変更すれば良いようです。

f:id:TakasDev:20200506160754p:plain

上記の設定を行うことで、認証とトークンの取得、トークンを使用したWebAPIへのアクセスが行えるようになりました。

最後に

今回作ってみたコードは下記となります。

github.com