我正在为客户构建一个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提供相应的App Registation。我们认为我们可以通过遵循相同的模式来获得回调,并在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>");
Web API2配置为具有托管服务标识。
我目前正在我的本地计算机上运行它,并且我已安装Azure CLI并且我已登录。我已尝试'az account get-access-token',并且我获得了有效令牌。< / p>
当Web API2试图让令牌能够调用Web API1时,我得到一个例外:
参数:Connectionstring:[未指定连接字符串],资源:,Authority :.异常消息:尝试了以下两种方法来获取访问令牌,但它们都没有工作。
参数:Connectionstring:[未指定连接字符串],资源:,Authority :.异常消息:尝试使用托管服务标识获取令牌。无法连接到托管服务标识(MSI)端点。请检查您是否在具有MSI设置的Azure资源上运行。
参数:Connectionstring:[未指定连接字符串],资源:,Authority :.异常消息:尝试使用Azure CLI获取令牌。无法获取访问令牌。错误:获取令牌请求返回http错误:400和服务器响应:{“error”:“invalid_grant”,“error_description”:“AADSTS65001:用户或管理员未同意使用ID为'04b07795-8ddb-461a的应用程序bbee-02f9e1bf7b46'named'Web API 1'。发送此用户和资源的交互式授权请求。\ r \ nTrace 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“:”f5bb0d4d -6f92-4fdd-81b7-e82a78720a00" , “CORRELATION_ID”: “04f92114-8d9d-40c6-b292-965168d6a919”}
有趣的是,在AAD1或AAD2中没有ID为“04b07795-8ddb-461a-bbee-02f9e1bf7b46”的应用程序。这是一个已知的Azure应用程序吗?我认为它可能是Service Management 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
(最后一个告诉我答复网址不正确;因为它不是我的应用程序之一,我找不到回复网址)
请注意,租户是AAD1。
我错过了什么,或者我没有正确使用此功能?
提前致谢。
答案 0 :(得分:2)
AzureServiceTokenProvider使用Azure CLI(以及其他选项)进行本地开发。对于服务调用Azure服务的方案,此方法使用Azure CLI中的开发人员标识,因为Azure服务允许访问用户和应用程序。
对于服务调用另一个自定义服务(如您的方案)的方案,您需要使用服务主体进行本地开发。为此,您有两种选择:
然后使用它登录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将使用此服务主体获取用于本地开发的令牌。
注意:这仅适用于本地开发。 AzureServiceTokenProvider在部署到App Service时将使用MSI。