2017-10-19 7 views
0

私は顧客のために多くの他のディレクトリにプロビジョニングされるクライアント用のAzureウェブアプリケーションを構築しています。このアプリはクライアントのディレクトリにあるWeb APIを呼び出し、顧客のディレクトリにある別のWeb APIを呼び出します。このようなもの:テナント間でAzureマネージドサービスアイデンティティを使用している例外

Other Customer AAD1 --------- My client AAD2 
App --------------------------------> Web API 2 
Web API 1 <-------------------------- Web API 2 

私たちは仕事の最初の呼び出しを得ることができました。これには、AAD1のWeb API 2対応のApp登録が必要です。 AAD2でWeb API1の登録を行うことで、同じパターンに従って動作するようにコールバックを取得できることがわかりました。しかし、それは私のクライアントのAADにこれらの「代理人」登録がたくさんあるかもしれないので、我々は代替案を検討している。

私たちは、マネージドサービスアイデンティティを使用して、他のテナントのリソースに有効なトークンを取得できると考えています。より良い方法があれば、私は確かにそれについて知ることに興味があります。

私はMicrosoft.Azure.Services.AppAuthenticationライブラリを使用して、ここからのコード例を踏襲してきました:https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity#obtaining-tokens-for-azure-resources

// In Web API 2 
using Microsoft.Azure.Services.AppAuthentication; 
// ... 
var azureServiceTokenProvider = new AzureServiceTokenProvider(); 
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync(
    "https://<App ID URI for Web API1>"); 

ウェブAPI2は、マネージドサービスの識別情報を有するように構成されています。

私は現在、ローカルマシン上でこれを実行しています。私はAzure CLIをインストールしてログインしています。「az account get-access-token」を試しました。

ウェブAPI2がWeb API1を呼び出すことができるようにトークンを取得しようとする

は、私は例外を取得:面白いのは、ID「04b07795-8ddb-461A-bbee-とはアプリケーションがないということです

Parameters: Connectionstring: [No connection string specified], Resource: , Authority: . Exception Message: Tried the following 2 methods to get an access token, but none of them worked.

Parameters: Connectionstring: [No connection string specified], Resource: , Authority: . Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.

Parameters: Connectionstring: [No connection string specified], Resource: , Authority: . Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. ERROR: Get Token request returned http error: 400 and server response: {"error":"invalid_grant","error_description":"AADSTS65001: The user or administrator has not consented to use the application with ID '04b07795-8ddb-461a-bbee-02f9e1bf7b46' named 'Web API 1'. Send an interactive authorization request for this user and resource.\r\nTrace ID: f5bb0d4d-6f92-4fdd-81b7-e82a78720a00\r\nCorrelation ID: 04f92114-8d9d-40c6-b292-965168d6a919\r\nTimestamp: 2017-10-19 16:39:22Z","error_codes":[65001],"timestamp":"2017-10-19 16:39:22Z","trace_id":"f5bb0d4d-6f92-4fdd-81b7-e82a78720a00","correlation_id":"04f92114-8d9d-40c6-b292-965168d6a919"}

02f9e1bf7b46 'をAAD1またはAAD2のいずれかに挿入する。これはAzureアプリとして知られていますか?私はそれがサービス管理APIかもしれないと思ったが、わからない。

いずれにしても、許可を与える適切な方法がわかりません。私は自分のブラウザにこのようなさまざまなコンテンツのURLを構築しようとしましたが、それらのどれもがトリックを行っているように見えるん:

https://login.microsoftonline.com/(AAD1 ID)/adminconsent 
    ?client_id=(App ID) 
    &redirect_uri=https://localhost:44341 
    &resource=(App ID URI for Web API1) 
    &prompt=admin_consent 

https://login.microsoftonline.com/(AAD1 ID)/adminconsent 
    ?client_id=04b07795-8ddb-461a-bbee-02f9e1bf7b46 
    &redirect_uri=https://localhost:44341 
    &resource=(App ID URI for Web API1) 
    &prompt=admin_consent 

(この最後の1返信URLが間違っていることを私に伝え、それはの一つではありませんので、私のアプリ、返信URLが見つかりません)

テナントはAAD1です。

何か不足していますか、この機能を正しく使用していませんか?

ありがとうございます。

+0

テナントごとに機能が異なるWeb API 1(お客様のディレクトリ内にあるAPI)が機能的に異なります(たとえば、ある顧客のテナントのPower BI、別の顧客のテナントのSharePoint Onlineなど)。または、同じAPIの異なるインスタンス(たとえば、1人の顧客のPower BI _、他の顧客のテナントのPower BI _など)ですか?誰がWeb API 1のコードを制御しますか?あなたのクライアント?または顧客の顧客ですか? –

+0

Web API1は、すべての顧客に対して同じAPIの異なるインスタンスです。クライアントはこれを所有して配布します。ありがとう! –

答えて

0

AzureServiceTokenProviderは、Azure CLI(他のオプションもあります)を使用してローカル開発を行います。サービスがAzureサービスを呼び出すシナリオでは、Azureサービスはユーザーとアプリケーションの両方にアクセスできるため、Azure CLIの開発者IDを使用して動作します。

サービスが(シナリオのように)別のカスタムサービスを呼び出す場合は、サービス開発者をローカル開発に使用する必要があります。これには、2つのオプションがあります。

  1. サービスプリンシパルを使用してAzure CLIにログインします。まず は、その後、それを使用してAzureのCLIにログインし https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest

地域開発のためのサービスプリンシパルを作成します。

az login --service-principal -u 25922285-eab9-4262-ba61-8083533a929b --password <<pwd>> --tenant 72f988bf-86f1-41af-91ab-2d7cd011db47 --allow-no-subscriptions 

このサービスプリンシパルはサブスクリプションにアクセスできないため、--allow-no-subscriptions引数を使用します。

ここで、AzureServiceTokenProviderは、ローカル開発にこのサービスプリンシパルを使用してトークンを取得します。

  1. 環境変数にサービスプリンシパルの詳細を指定します。 AzureServiceTokenProviderは、ローカル開発に指定されたサービスプリンシパルを使用します。このサンプルでは、​​ローカル開発環境のサービスプリンシパルを使用してアプリケーションを実行します()。 https://github.com/Azure-Samples/app-service-msi-keyvault-dotnet

注:Thはローカル開発用です。 AzureServiceTokenProviderはApp ServiceにデプロイされたときにMSIを使用します。

関連する問題