代表用户在多租户,基于AD的AD应用程序中获取令牌 - 未配置访问用户信息的权限?

时间:2015-08-21 13:30:04

标签: c# openid multi-tenant azure-active-directory

我目前正在为一系列基于云的微服务构建一个身份验证模型,并且在尝试代表经过身份验证的用户从Azure AD获取令牌时遇到了问题。我觉得我错过了一些明显的东西,所以我希望有人能指出我正确的方向。

概述

我的原型包含两个应用程序:

  • Asp.MVC基础UI
  • 基于WebAPI的数据服务。

这两个应用程序都托管在azure中,并使用Azure的活动目录进行访问管理。在azure中,我设置了两个AD实例:

  • 服务目录:这是注册所有应用程序的主目录。
  • 租户目录:租户的AD实例。展望未来,每个租户都会有其中一个。

UI和数据服务都在服务目录中注册并设置为多租户。 UI身份验证基于Vibronet's multi-tenant sample,并在用户首次登录时正确推送用户完成同意授权流程,然后将UI应用程序注册到用户AD实例。在同意授予期间,UI请求以下权限:

  • 访问您组织的目录
  • 启用登录并阅读用户的个人资料
  • 读取和写入目录数据
  • 读取目录数据

然后将用户重定向回UI应用程序,此时我可以成功查看用户声明信息。所以,直到这一点,我相信一切都已配置并正常工作。

问题

一旦用户通过身份验证,UI应用程序就应该代表当前用户获取令牌以访问后端数据服务,这就是问题所在。

数据服务的身份验证基于WebApi-On-Behalf-of示例,但每当我尝试获取令牌时,都会收到以下错误:

[AppGuid] 应用程序未配置访问用户信息的权限,或已过期或已撤消

但是,鉴于在同意流程中授予的权限,我认为它应该有权访问租户AD实例并尝试向UI应用程序提供AD中可用的所有应用程序和委派权限并重新运行同意流但仍然得到相同的结果。

我获取代表令牌的代码如下:

ClientCredential uICredentials = new ClientCredential(StartUp.UiClientId, StartUp.UiSecret);
BootstrapContext bootStrapContext = GetBootstrapContext();
UserAssertion userAssertion = new UserAssertion(bootStrapContext.Token);
AuthenticationContext authContext = new AuthenticationContext(StartUp.adAuthority);
var authResult = authContext.AcquireToken(routerServiceResourceId, uICredentials, userAssertion);

在最后一行引发异常。这里的参数是:

  • StartUp.UiClientId:服务目录中UI的应用程序ID。
  • StartUp.UiSecret:服务目录中UI应用程序的密钥。
  • StartUp.adAuthority:我已尝试使用多租户应用程序(https://login.microsoftonline.com/common/)的公共AD端点以及此租户的特定端点(https://login.microsoftonline.com/tenantid)。两者都给出了相同的结果。
  • routerServiceResourceId:数据服务的App Id URI。

此外,我在UI应用程序的TokenValidationParameters中将'SaveSigninToken'设置为true,这样我就可以获得BootstrapContext.Token。

据我所知,这是它需要工作的一切,但正如我所说,我不断得到上面的错误= /

任何人都可以建议前进/明显的解决方案/进一步阅读。我似乎正在撞击这头而不是走得太远。我也不是100%关于这个问题的相关信息,所以如果我错过了任何重点,请告诉我,我可以更新问题。

1 个答案:

答案 0 :(得分:2)

在这种情况下,OnBehalf的流程并不合适。当WebAPI收到访问令牌并需要获取下游WebAPI的访问令牌时,OnBehalf of flow是合适的。在您的情况下最合适的流程是OpenID Connect代码+ id_token流程。在此流程中,WebApp接收用于对用户进行身份验证的id_token以及允许WebApp获取后端服务器的访问令牌的授权代码。然后,WebApp会兑换访问令牌的授权码。

此流程的最佳示例如下:

https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet

注意设置AuthorizationCodeRecieved通知的Startup.Auth.cs。这显示了如何检索代码并将其兑换。