如何在多租户环境中配置代表身份验证?

时间:2017-03-29 23:11:36

标签: azure-active-directory adal

我有一个本机客户端,它调用我写的服务 - 然后调用Graph API(使用原始调用者的凭据)。

这与此处找到的'onbehalfof'示例完全相同(我的代码与示例相同):

https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

当作为用户从与服务(租户A)相同的租户登录时,一切正常(就像样本的上半部分一样)。当从另一个租户(租户B)以用户身份登录时,我在服务中的这一行获得了一个例外:

result = await authContext.AcquireTokenAsync(GraphResourceId, clientCred, userAssertion);

(这是onbehalfof示例中TodoListController.cs的第153行)。

例外是:

  

AADSTS65001:用户或管理员未同意使用   应用ID为'de2fb28b-83f8-419d-9b00-3fbce0a60bf4'。发送一个   此用户和资源的交互式授权请求。\ r \ nTrace   ID:6865c420-674a-4adf-a070-3d9b9c500200 \ r \ n相关ID:   7e088563-d7fe-4131-a05c-cbe04dbb2bbd \ r \ n时间戳:2017-03-29   22:56:58Z

上面的应用程序ID是指我写的服务(在onbehalfofsample中的TodoListService中是同一行)。

我为多租户身份验证配置了所有内容。但这是我的服务正在向另一个导致问题的服务(Graph API)进行的附加调用。我需要在Azure门户中执行哪些其他配置才能使其正常工作?

4 个答案:

答案 0 :(得分:1)

现在正在运作。我必须进行两项更改才能使其正常运行。

首先,在服务端切换到使用“common”作为租户。我已经在客户端切换到普通,但没有意识到你必须在服务端做到这一点:

<add key="ida:Tenant" value="common" />

其次,将服务上的GraphUserUrl更改为以下URL:

<add key="ida:GraphUserUrl" value="https://graph.windows.net/me?api-version=1.6" />

示例中的原始网址不起作用(至少对于其他租户中的用户而言)。

答案 1 :(得分:0)

在为上面链接的示例编写的说明中,他们通过以下部分解决了这个问题:

  

配置已知客户端应用程序

     

要使中间层Web API能够调用下游Web API,   用户必须以中的形式授予中间层权限   同意。因为中间层没有自己的交互式UI,所以   需要显式绑定Azure AD中的客户端应用程序注册   Web API的注册,它合并了所需的同意   客户和客户中间层成单个对话框。你可以这样做   将客户端应用程序的“客户端ID”添加到Web清单中   knownClientApplications属性中的API。方法如下:

     
      
  1. 导航到“TodoListService”应用注册,然后打开清单编辑器。
  2.   
  3. 在清单中,找到knownClientApplications数组属性,并将客户端应用程序的客户端ID添加为元素。

         

    完成后,您的代码应如下所示:   "knownClientApplications": ["94da0930-763f-45c7-8d26-04d5938baab2"]

  4.   
  5. 点击“保存”按钮保存TodoListService清单。
  6.   

我的假设是因为你遇到了这个问题,你还没有完成这个特殊的配置。

您拥有的另一个选项是明确请求中间层和AAD Graph API之间的同意。您可以通过租户管理员“登录”并同意您的中间层服务来执行此操作。您需要做的就是生成一个具有中间层App ID的登录URL。

但是,我强烈建议您按照文档化的方式进行,因为这将为您的用户提供更好的体验。

答案 2 :(得分:0)

此处是来自其他租户的用户登录时显示的同意对话框:

Consent Dialog

答案 3 :(得分:0)

这是我的客户端清单......

Client Manifest

...和我的服务清单......

Service Manifest

相关问题