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

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

AADSTS501051 <ClientId> is not assigned to a role for the application への対処

出るたびに対応を忘れて調べているのでメモ。

Microsoft.Identity.ClientConfidentialClientApplicationBuilderでシークレットを使用したアクセストークンの取得を行いたいときに発生する場合の対応です。

はじめに

2021年7月時点の情報です。

参照時期によっては記事内の画面キャプチャや設定内容が異なっている可能性があるのでご留意ください。

何が起きているのか

エラーは下記のような内容です。

MsalUiRequiredException: AADSTS501051: Application 'Client Id'(AAD App name) is not assigned to a role for the application 'Scopes'(AAD App name).

僕がよくやる構成の話です。

Entiprise Applications上で認証に使用しているAzure ADアプリケーションの設定で

ユーザー割当必須にしている場合があります。

f:id:TakasDev:20210711111246p:plain

雑にサインインの制御を行いたい場合(ゲストユーザーのみとかその逆とか)の設定で

シークレット認証の場合ユーザーの情報を伴わない状態なのでエラーになる。というわけです。

対処

App Roleの作成

認証を行いたいAzure ADアプリケーションのApp rolesでアプリケーションのRole作成を行います。

項目 設定内容
Display name 任意な名前
Allowed member types Applications
Value 任意な値
Description Roleの説明文

APIのアクセス許可の設定

次にシークレット認証用のAzure ADアプリケーションを用意します。

このアプリケーションはユーザー割当必須の設定は行いません。

API permissionsから認証を行いたいAzureADアプリケーションへのアクセス許可の設定を行います。

先程設定を行った認証を行いたいAzure ADアプリケーションを指定します。

Appliaction permissionsで先程作成したApp Roleを指定します。

f:id:TakasDev:20210711113440p:plain

シークレットによる認証が可能となる

シークレット認証用のAzure ADアプリケーションでシークレットを生成し確認を行います。

f:id:TakasDev:20210711114527p:plain

モザイクだらけでアレですが、audが適切な形となっていること

rolesは指定したアプリケーションロールが設定されていることが確認できます。

おわりに

ちょいちょい発生しては対処方法を忘れているAADSTS501051のメモでした。