我有一个本机客户端,它调用我写的服务 - 然后调用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门户中执行哪些其他配置才能使其正常工作?
答案 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。方法如下:
- 导航到“TodoListService”应用注册,然后打开清单编辑器。
在清单中,找到knownClientApplications数组属性,并将客户端应用程序的客户端ID添加为元素。
完成后,您的代码应如下所示:
"knownClientApplications": ["94da0930-763f-45c7-8d26-04d5938baab2"]
- 点击“保存”按钮保存TodoListService清单。
醇>
我的假设是因为你遇到了这个问题,你还没有完成这个特殊的配置。
您拥有的另一个选项是明确请求中间层和AAD Graph API之间的同意。您可以通过租户管理员“登录”并同意您的中间层服务来执行此操作。您需要做的就是生成一个具有中间层App ID的登录URL。
但是,我强烈建议您按照文档化的方式进行,因为这将为您的用户提供更好的体验。
答案 2 :(得分:0)
此处是来自其他租户的用户登录时显示的同意对话框:
答案 3 :(得分:0)