web-dev-qa-db-ja.com

ClientCredentialを使用したAcquireTokenがinvalid_client(ACS50012)で失敗するのはなぜですか?

AzureADアプリケーションでoauth client_credentialsの付与が許可されないのはなぜですか?

Azure Graph APIを使用したいのですが、最初にoauthトークンが必要です。トークンを取得するには、Microsoft.IdentityModel.Clients.ActiveDirectory、別名ADALバージョン1.0.3を使用しようとしています( NuGetから)。

ClientCredentialオブジェクトを受け取るAuthenticationContext.AcquireTokenのオーバーロードを使用しています。 (アプリではなくサービスを作成しているため、ユーザーにログインを求めるオーバーロードを使用できません。)

さまざまなチュートリアル/サンプルで説明されているようにAzureAD Webアプリケーションを構成しました(例: ADAL-サーバー間認証 )。

私のコードは次のようになります:

AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/thommmondago.onmicrosoft.com");
ClientCredential cc = new ClientCredential("41151135-61b8-40f4-aff7-8627e9eaf853", clientSecretKey);
AuthenticationResult result = ac.AcquireToken("https://graph.windows.net", cc);

AcquireToken行は例外をスローします。

sts_token_request_failed: Token request to security token service failed.  Check InnerException for more details

内部例外はWebExceptionであり、受信した応答はoauthエラー:

{ "error":"invalid_client",
 "error_description":"ACS50012: Authentication failed."
 "error_codes":[50012],
 "timestamp":"2014-03-17 12:26:19Z",
 "trace_id":"a4ee6702-e07b-40f7-8248-589e49e96a8d",
 "correlation_id":"b304af2e-2748-4067-99d0-2d7e55b121cd" }

ADALをバイパスし、oauthエンドポイントでcurlを使用すると、同じエラーが発生します。

見つけたAzureアプリケーションの詳細を使用すると、コードが機能します ここ

AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/graphDir1.onmicrosoft.com");
ClientCredential cc = new ClientCredential("b3b1fc59-84b8-4400-a715-ea8a7e40f4fe", "FStnXT1QON84B5o38aEmFdlNhEnYtzJ91Gg/JH/Jxiw=");
AuthenticationResult result = ac.AcquireToken("https://graph.windows.net", cc);

だから、それは私のコードのエラーではありません。 Azure ADのエラーか、ClientCredentialパラメーターが間違っていると思います。

9
tjleigh

これはWindowsAzureのエラーであることが判明し、コードまたは構成に問題はありませんでした。

MicrosoftがAzureの問題を修正した後、新しいアプリケーションを作成する必要があり、それが機能し始めました。

マイクロソフトからのフォーラム回答:

Hi,

昨日終了する数日の時間範囲で作成されたアプリケーションでいくつかのエラーが発生しています。私たちはこれらのアプリケーションを修正し続けていますが、これがいつ行われるかについては良いetaがありません。ここでの影響についてお詫び申し上げます。

新しいアプリケーションを作成し、新しいクライアントIDで操作を再結合してみてください。

ありがとう

6
tjleigh

このリンクをご覧ください: https://Azure.Microsoft.com/en-gb/documentation/articles/resource-manager-net-sdk/

Active Directory認証ライブラリの最新バージョンはAcquireTokenメソッドをサポートしていません。代わりに、AcquireTokenAsyncメソッドを使用する必要があります。

var result = await authenticationContext.AcquireTokenAsync(resource: "https://{domain}.onmicrosoft.com/{site-if applicable}", clientCredential: credential);
2
Arun Kumar

同じ問題が発生していましたが、Azureから直接(Azure Webサイト内で)コードを実行するだけでした。

「Microsoft.IdentityModel.Clients.ActiveDirectory」パッケージを「2.6.1-alpha」にアップグレードすることを解決しました

1
emmekappa

Azureバージョンのトランスレータは状況をもう一度変更しました-Oauthトークンリクエストは新しいURLを使用し、他のすべての手荷物ではなく、秘密鍵のみを必要とします。このページではそれについて説明しています(ただし、 PHPコード): http://www.bradymoritz.com/php-code-for-bingmicrosoftazure-translator/

主な項目は次のとおりです。

  1. 空のリクエストを https://api.cognitive.Microsoft.com/sts/v1.0/issueToken に投稿します
  2. ヘッダー「Ocp-Apim-Subscription-Key:」を使用して秘密鍵を渡します
  3. または、クエリ文字列パラメータを使用します: "Subscription-Key ="

次に、リターンの本文を実際のトークンとして取得します。これは、json形式ではなく、本文全体です。

これは以前に使用された方法よりもはるかに簡単ですが、状況が再び変わったことは間違いなく苦痛です。

0
Brady Moritz