Azure active directory 如何在多租户环境中代表身份验证进行配置?
我有一个本机客户机,它调用我编写的服务,然后调用Graph API(使用原始调用方的凭据) 这与此处的“onbehalfof”示例完全相同(我的代码与示例的失败方式相同): 当作为用户从与服务相同的租户(租户a)登录时,一切正常(就像代表示例一样)。当从其他租户(租户B)以用户身份登录时,我在服务中的这一行遇到异常:Azure active directory 如何在多租户环境中代表身份验证进行配置?,azure-active-directory,adal,Azure Active Directory,Adal,我有一个本机客户机,它调用我编写的服务,然后调用Graph API(使用原始调用方的凭据) 这与此处的“onbehalfof”示例完全相同(我的代码与示例的失败方式相同): 当作为用户从与服务相同的租户(租户a)登录时,一切正常(就像代表示例一样)。当从其他租户(租户B)以用户身份登录时,我在服务中的这一行遇到异常: result = await authContext.AcquireTokenAsync(GraphResourceId, clientCred, userAssertion);
result = await authContext.AcquireTokenAsync(GraphResourceId, clientCred, userAssertion);
(这是onbehalfof示例中TodoListController.cs的第153行)
例外情况如下:
AADSTS65001:用户或管理员尚未同意使用
ID为“de2fb28b-83f8-419d-9b00-3fbce0a60bf4”的应用程序。发送
此用户和资源的交互式授权请求。\r\n访问
ID:6865c420-674a-4adf-a070-3d9b9c500200\r\n相关ID:
7e088563-d7fe-4131-a05c-CBE04DB2B\r\n测试步骤:2017-03-29
22:56:58Z
上面的应用程序id引用了我编写的服务(与OnBehalfOf示例中TodoListService中的同一行)
我为多租户身份验证配置了所有内容。但导致问题的是我的服务对另一个服务(Graph API)的额外调用。我需要在Azure门户中执行哪些其他配置才能实现此功能?在为您上面链接的示例编写的说明中,它们通过以下部分解决了此问题: 配置已知的客户端应用程序 为了使中间层web API能够调用下游web API, 用户必须以 同意。因为中间层没有自己的交互UI,所以 需要将Azure AD中的客户端应用注册显式绑定到
web API的注册,它合并了 将客户端和中间层合并到一个对话框中。你可以这样做 将客户端应用程序的“客户端ID”添加到web的清单中 knownClientApplications属性中的API。以下是方法:
“knownClientApplications”:[“94da0930-763f-45c7-8d26-04d5938baab2”]
但是,我强烈建议您以文档化的方式进行,因为这将为您的用户提供更好的体验。这是来自其他租户的用户登录时出现的同意对话框:
这是我的客户名单 …还有我的服务清单
它现在正在工作。我必须做两个改变才能让它工作 首先,在服务端切换到使用“common”作为租户。我已在客户端切换到common,但没有意识到您也必须在服务端执行此操作:
<add key="ida:Tenant" value="common" />
其次,将服务上的GraphUserUrl更改为以下URL:
<add key="ida:GraphUserUrl" value="https://graph.windows.net/me?api-version=1.6" />
示例中的原始URL不起作用(至少对于其他租户中的用户是如此)。不是这样。我确实正确地设置了knownClientApplications。如果我没有这样做,当从另一个租户以用户身份登录时,对该服务的调用就会失败(而且我永远不会到达示例中的第153行)。当您以用户身份从与服务相同的租户登录时,该示例将按照广告的方式工作。但是,如果您从其他租户以用户身份登录,则会因上述错误而失败。有什么想法吗?“将客户和中间层要求的同意合并到一个对话框中”。。。您在同意对话中看到了什么?请参阅答案,我在其中包含了同意对话的屏幕截图。我添加了一个带有我的客户和服务清单屏幕截图的答案。这些“评论”应该是对原始帖子的编辑。