0

我正在为客户构建一个 Azure Web 应用程序,该应用程序将为其客户配置到许多其他目录中。这个应用程序将调用我客户目录中的 Web API,然后它会回调客户目录中的另一个 Web API。像这样的东西:

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

我们已经能够接到第一个上班的电话。这需要在 AAD1 中为 Web API 2 进行相应的应用注册。我们认为我们可以按照相同的模式让回调工作,在 AAD2 中注册 Web API1。但是,这可能是我客户的 AAD 中的大量此类“代理”注册,因此我们正在寻找替代方案。

我们正在探索使用托管服务身份,我们认为这将使我们能够获得对其他租户中的资源有效的令牌。如果有更好的方法,我当然有兴趣了解它。

我已经使用 Microsoft.Azure.Services.AppAuthentication 库从这里遵循了代码示例:https ://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity#获取 azure 资源的令牌

// 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>");

Web API2 配置为具有托管服务标识。

我目前正在我的本地计算机上运行它,并且我已经安装了 Azure CLI 并已登录。我尝试了“az account get-access-token”,并获得了一个有效的令牌。

当 Web API2 尝试获取能够调用 Web API1 的令牌时,出现异常:

参数:连接字符串:[未指定连接字符串],资源:,权限:。异常消息:尝试了以下 2 种方法来获取访问令牌,但都没有奏效。

参数:连接字符串:[未指定连接字符串],资源:,权限:。异常消息:尝试使用托管服务标识获取令牌。无法连接到托管服务标识 (MSI) 端点。请检查您是否在具有 MSI 设置的 Azure 资源上运行。

参数:连接字符串:[未指定连接字符串],资源:,权限:。异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。错误:获取令牌请求返回 http 错误:400 和服务器响应:{"error":"invalid_grant","error_description":"AADSTS65001: 用户或管理员未同意使用 ID 为 '04b07795-8ddb-461a- 的应用程序bbee-02f9e1bf7b46' 名为 'Web API 1'。为此用户和资源发送交互式授权请求。\r\n跟踪 ID: f5bb0d4d-6f92-4fdd-81b7-e82a78720a00\r\n相关 ID: 04f92114-8d9d-40c6-b292 -965168d6a919\r\n时间戳:2017-10-19 16:39:22Z","error_codes":[65001],"timestamp":"2017-10-19 16:39:22Z","trace_id":"

有趣的是,在 AAD1 或 AAD2 中都没有 ID 为“04b07795-8ddb-461a-bbee-02f9e1bf7b46”的应用程序。这是一个已知的 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

(最后一个告诉我回复 URL 不正确;因为它不是我的应用程序之一,所以我找不到回复 URL)

请注意,租户是 AAD1。

我错过了什么,还是我没有正确使用此功能?

提前致谢。

4

1 回答 1

2

AzureServiceTokenProvider 使用 Azure CLI(以及其他选项)进行本地开发。对于服务调用 Azure 服务的场景,这可以使用 Azure CLI 中的开发人员身份,因为 Azure 服务允许访问用户和应用程序。

对于服务调用另一个自定义服务的场景(如您的场景),您需要使用服务主体进行本地开发。为此,您有两种选择:

  1. 使用服务主体登录到 Azure CLI。首先,为本地开发创建服务主体 https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest

然后使用它登录到 Azure CLI。

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

注意:这仅用于本地开发。AzureServiceTokenProvider 将在部署到应用服务时使用 MSI。

于 2017-10-20T19:45:51.087 回答