【问题标题】:How to configure on-behalf-of authentication in multi-tenant environment?如何在多租户环境中配置代理身份验证?
【发布时间】:2017-03-29 23:11:36
【问题描述】:

我有一个本机客户端,它调用我编写的服务 - 进而调用 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\n跟踪 ID: 6865c420-674a-4adf-a070-3d9b9c500200\r\n相关 ID: 7e088563-d7fe-4131-a05c-cbe04dbb2bbd\r\n时间戳:2017-03-29 22:56:58Z

上面的application id指的是我写的服务(和onbehalfofsample中TodoListService中的同一行)。

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

【问题讨论】:

    标签: azure-active-directory adal


    【解决方案1】:

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

    首先,在服务端切换到使用“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 不起作用(至少对于另一个租户中的用户)。

    【讨论】:

    • 这些“cmets”应该是对原始帖子的编辑。
    【解决方案2】:

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

    配置已知的客户端应用程序

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

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

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

    3. 点击“保存”按钮保存 TodoListService 清单。

    我的假设是因为你遇到了这个问题,所以你没有做这个特殊的配置。

    您的另一个选项是明确请求中间层和 AAD 图形 API 之间的同意。您可以通过让租户管理员“登录”并同意您的中间层服务来做到这一点。您需要做的就是生成一个带有中间层 App ID 的登录 url。

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

    【讨论】:

    • 不是这样的。我确实正确设置了 knownClientApplications。如果我没有,当以另一个租户的用户身份登录时,对服务的调用将失败(我永远不会到达示例中的第 153 行)。当您从与服务相同的租户中以用户身份登录时,该示例的工作原理与宣传的一样。但是,如果您以来自不同租户的用户身份登录,则会失败并出现上述错误。有什么想法吗?
    • “将客户端和中间层所需的同意合并到一个对话框中”...您在同意对话框中看到了什么?
    • 查看答案,其中包含同意对话框的屏幕截图。
    【解决方案3】:

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

    Consent Dialog

    【讨论】:

    • 我为我的客户端和服务清单添加了一个带有屏幕截图的答案。
    【解决方案4】:

    这是我的客户清单...

    Client Manifest

    ...还有我的服务清单...

    Service Manifest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多