我有一个本地客户端,它调用我编写的服务--然后调用Graph (使用原始调用者的凭据)。
这与这里找到的'onbehalfof‘示例完全一样(我的代码失败的方式与示例相同):
https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof
当以与服务相同的租户(承租者A)的用户身份登录时,一切正常(就像代表示例一样)。当以来自不同租户(承租者B)的用户身份登录时,我在服务中得到了这一行的异常:
result = await authContext.AcquireTokenAsync(GraphResourceId, clientCred, userAssertion);(这是样本中TodoListController.cs的第153行)。
例外是:
AADSTS65001:用户或管理员未同意使用ID为'de2fb28b-83f8-419d-9b00-3fbce0a60bf4‘的应用程序。发送该用户和资源的交互式授权请求。\r\n跟踪ID: 6865c420-674a-4adf-a070-3d9b9c500200\r\nCorrelation ID: 7e088563-d7fe-4131-a05c-cbe04dbb2bbd\r\nTimestamp: 2017-03-29 22:56:58Z
上面的应用程序id引用了我编写的服务(这是onbehalfof示例中的TodoListService中的同一行)。
我配置了所有用于多租户身份验证的内容。但是,正是我的服务对另一个服务(Graph )的额外调用导致了这个问题。在Azure门户中,我需要做什么额外的配置来完成这个工作?
发布于 2017-03-30 21:16:29
现在起作用了。我得做两次改变才能让它起作用。
首先,在服务端切换到使用“公共”作为租户。我已经在客户端切换到了公共服务,但没有意识到您也必须在服务端这样做:
<add key="ida:Tenant" value="common" />其次,将服务上的GraphUserUrl更改为以下URL:
<add key="ida:GraphUserUrl" value="https://graph.windows.net/me?api-version=1.6" />示例中的原始URL不起作用(至少对于另一个租户中的用户来说是这样)。
发布于 2017-03-30 05:19:17
在为上面链接的示例编写的说明中,它们用以下部分解决了这个问题:
配置已知的客户端应用程序 要使中间层web API能够调用下游web API,用户必须以同意的形式授予中间层权限。由于中间层没有自己的交互式UI,因此需要显式地将Azure AD中的客户端应用程序注册与web API的注册绑定,后者将客户机和中间层所需的同意合并到一个对话框中。您可以通过将客户端应用程序的“客户端ID”添加到knownClientApplications属性中的web清单中来做到这一点。下面是操作步骤:
"knownClientApplications": ["94da0930-763f-45c7-8d26-04d5938baab2"]我的假设是,因为您遇到了这个问题,所以您还没有完成这个特殊的配置。
另一个选项是显式请求中间层和AAD图形API之间的同意。您可以通过让租户管理员‘登录’并同意您的中间层服务来做到这一点。您需要做的就是生成一个带有中间层App的登录url。
但是,我强烈建议您使用文档化的方法,因为这将为您的用户提供更好的体验。
发布于 2017-03-30 19:55:19
下面是一个来自另一个租户的用户登录时出现的同意对话框:
https://stackoverflow.com/questions/43105793
复制相似问题