Azure AAD - 対象ユーザーが無効です 質問する

Azure AAD - 対象ユーザーが無効です 質問する

Azure Active Directory で保護された WebAPI を作成しました。これを今すぐテストする必要があり、認証ヘッダーで Fiddler を使用しようとしています。以下のコードでトークンを生成しようとしています。

Target obj = (Target)cmbTarget.SelectedItem;

AuthenticationResult authenticationResult;
string aadInstance = obj.AADInstance; // "https://login.windows.net/{0}";
string tenant = obj.Tenant; //"rudderless.onmicrosoft.com";
string apiResourceId = obj.ApiResourceId; //"15b4ac7f-23a8-4958-96a5-64159254690d";
string clientId = obj.ClientId; // "47cdc6c3-226a-4c38-b08e-055be8409056";

Uri redirectUri = new Uri(obj.RedirectUri); //new Uri("http://nativeclient");
string authority = string.Format(aadInstance, tenant);
authContext = new AuthenticationContext(authority);

authenticationResult = this.authContext.AcquireToken(apiResourceId, 
                            clientId, redirectUri, PromptBehavior.Always);

txtToken.Text = authenticationResult.AccessToken;
Clipboard.SetText($"Bearer {txtToken.Text}");

トークンは正常に生成されましたが、そのトークンを使用してWebAPIを呼び出すと、メッセージとともに401がスローされます。

WWW-Authenticate: Bearer error="invalid_token", error_description="オーディエンスが無効です"

ベストアンサー1

認証のさまざまな手順を再検討することが重要だと思います。議論を通じて、抱えている問題を解決できることを願っています。

クライアントがリソースへのアクセス トークンを取得しようとする場合、トークンを取得するリソースを AAD に指定する必要があります。クライアントは、すべて異なる構成の複数のリソースを呼び出すように構成されている可能性があるため、アクセス トークン要求では常にリソースが指定されることが期待されます。

リソースは、リソースの App ID GUID か、リソースに登録されている有効な App ID URI のいずれかになります。AAD は、指定した値に基づいて、アクセスしようとしているリソースを一意に識別できる必要があります。ただし、App ID GUID を使用する場合は、Audience クレームが App ID GUID であるトークンが AAD から取得されることに注意してください。または、App ID URI を使用する場合は、その URI がトークン内のオーディエンス クレームとして表示されます。

どちらの場合も、「同じ」リソースのトークンを取得しますが、トークン内のクレームの表示は異なります。さらに、1 つのアプリケーション リソースに、アプリに登録された複数の App ID URI が存在する可能性があります。認証要求でどれを使用するかに応じて、渡したリソース パラメーターと一致するトークン内の異なるオーディエンス クレームを取得します。

最後に、トークンを取得したら、それをリソースAPIに送信します。リソースAPIは、クライアントIDクレーム、スコープ/ロールクレーム、認証方法(「acr」クレーム)など、いくつかの点についてトークンを検証します。絶対に観客の主張は彼らの期待と一致しています!

つまり、リソース API は最終的に「< App ID GUID > を有効なオーディエンス クレームとして受け入れます」または「< App ID URI > を有効なオーディエンス クレームとして受け入れます」と宣言する必要があります。この種のロジックは、使用しているライブラリ (OWIN など) に組み込まれている可能性がありますが、API 側で、想定するオーディエンスに対して正しく構成されていることを確認する必要があります。必要に応じて、API がオーディエンス クレームをまったくチェックしないようにすることもできます。トークン内のすべてのクレームはプレーンテキストであるため、実際には何でも好きなようにできますが、その状況ではあまり安全な API にはなりません :]

結局のところ、このエラーは独自の API から発生しており、リソースの App ID GUID (コード サンプルに基づいてトークンを取得するときに渡しているもののように見えます) に一致する Audience クレームを受け入れるようにアプリを構成していないために発生しているのではないかと思います。

これで問題が解決することを願っています。

おすすめ記事