web-dev-qa-db-ja.com

AzureAAD-オーディエンスが無効です

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

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-認証:ベアラーerror = "invalid_token"、error_description = "オーディエンスが無効です"

6
Shiju Samuel

認証のさまざまなステップを再検討することが重要だと思います。話し合いを通じて、発生している問題を解決できることを願っています。

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

リソースは、リソースのアプリID GUID、またはリソースに登録されている有効なアプリID URIのいずれかです。AADは、到達しようとしているリソースを一意に識別できる必要があります。ただし、App ID GUIDを使用する場合は、AADからトークンを取得します。この場合、オーディエンスクレームはApp ID GUIDです。または、App ID URIを使用する場合は、そのURIが表示されます。聴衆がトークンで主張するように。

どちらの状況でも、「同じ」リソースのトークンを取得しますが、トークン内のクレームは異なって表示されます。さらに、単一のアプリケーションリソースで、アプリに複数のアプリIDURIが登録されている可能性があります。認証リクエストで使用するものに応じて、渡したリソースパラメータに一致するトークンで異なるオーディエンスクレームを取得します。

最後に、トークンを取得したら、リソースAPIに送信します。リソースAPIは、クライアントIDクレーム、スコープ/ロールクレーム、認証方法(「acr」クレーム)など、さまざまな点でトークンを検証します。 、および間違いなくオーディエンスの主張が彼らが期待するものと一致すること!

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

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

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

9
Shawn Tabrizi

私も同じ問題を抱えていました。それを共有することを考えました。 Web APIAudienceをWebアプリのClientIdに変更しました。この後、それは機能します。

2
Rajkumar Peter

私も同じ問題を抱えていました。サーバーのリソースIDを使用する必要があるときに、クライアントのリソースIDをAcquireTokenのパラメーターとして使用していました。

正しいリソースIDを使用すると機能します。

0
Koja