Azure active directory 如何在多租户环境中代表身份验证进行配置?

Azure active directory 如何在多租户环境中代表身份验证进行配置?,azure-active-directory,adal,Azure Active Directory,Adal,我有一个本机客户机,它调用我编写的服务,然后调用Graph API(使用原始调用方的凭据) 这与此处的“onbehalfof”示例完全相同(我的代码与示例的失败方式相同): 当作为用户从与服务相同的租户(租户a)登录时,一切正常(就像代表示例一样)。当从其他租户(租户B)以用户身份登录时,我在服务中的这一行遇到异常: result = await authContext.AcquireTokenAsync(GraphResourceId, clientCred, userAssertion);

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

这与此处的“onbehalfof”示例完全相同(我的代码与示例的失败方式相同):

当作为用户从与服务相同的租户(租户a)登录时,一切正常(就像代表示例一样)。当从其他租户(租户B)以用户身份登录时,我在服务中的这一行遇到异常:

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。以下是方法:

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

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

  • 单击“保存”按钮保存TodoListService清单
  • 我的假设是,因为您遇到了这个问题,所以您没有进行这种特殊的配置

    另一个选项是在中间层和AAD图形API之间显式请求同意。您可以通过让租户管理员“登录”并同意您的中间层服务来实现这一点。您只需生成一个带有中间层应用程序ID的登录url


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

    这是来自其他租户的用户登录时出现的同意对话框:


    这是我的客户名单

    …还有我的服务清单


    它现在正在工作。我必须做两个改变才能让它工作

    首先,在服务端切换到使用“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行)。当您以用户身份从与服务相同的租户登录时,该示例将按照广告的方式工作。但是,如果您从其他租户以用户身份登录,则会因上述错误而失败。有什么想法吗?“将客户和中间层要求的同意合并到一个对话框中”。。。您在同意对话中看到了什么?请参阅答案,我在其中包含了同意对话的屏幕截图。我添加了一个带有我的客户和服务清单屏幕截图的答案。这些“评论”应该是对原始帖子的编辑。