我正在为客户构建一个 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。
我错过了什么,还是我没有正确使用此功能?
提前致谢。