在租户

时间:2017-10-19 18:26:57

标签: azure-msi

我正在为客户构建一个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。

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

提前致谢。

1 个答案:

答案 0 :(得分: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
  2. 然后使用它登录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
    2. 注意:这仅适用于本地开发。 AzureServiceTokenProvider在部署到App Service时将使用MSI。