了解Microsoft Azure AD代理(OBO)流程

时间:2019-06-28 08:03:36

标签: azure azure-active-directory

FE->(token_a)中间人->(token_b)DownstreamServiceA

我的理解是,为了使Middleman能够对DownstreamServiceA进行API调用,它需要使用token_b来交换token_a。我试图在邮递员中模拟这种行为。但是我无法使用token_b交换token_a。我收到以下错误

AADSTS65001: The user or administrator has not consented to use the application with ID '{my-middleman-clientid}'

在Azure门户上,我已配置FE API权限以访问DownstreamServiceAMiddleman的公开API范围。当时也代表我的组织用户获得了管理员的同意。

获取令牌_a

POST to https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
grant_type:password
client_secret: foobar
client_id: my-fe-clientid
username: awesome
password: bar
scope: api://{MiddlemanId}/Middleman.All

交换令牌_b

POST to https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer
client_id: my-middleman-clientid
client_secret: foobar
scope: api://{DownstreamServiceAId}/ServiceA.all
assertion: {token_a}
requested_token_use: on_behalf_of

我可以知道我做错了什么吗?我的理解是,我的FE需要预先申请和授予DownStreamServiceA范围的权限,这是我在Azure门户上进行的管理员授予所完成的。

1 个答案:

答案 0 :(得分:1)

似乎您已授予FE对Middleman的访问权限,并且已授予FE对DownstreamServiceA的访问权限,但可能未授予Middleman对DownstreamServiceA的访问权限。

有几种方法可以执行此操作,如Granting consent for the middle-tier application中所述:

  • 在Middlemanm中,将FE声明为“已知客户端应用程序”(清单/应用程序对象中的knownClientApplications),并通过在FE上请求scope=openid api://{MiddlemanId}/.default来触发“合并”同意。同意提示将包括FE和Middleman都需要的所有权限,并且将根据需要正确地为FE授予Middleman和Middleman授予DownstreamServiceA记录的授予。
  • 在DownstreamServiceA中,将Middleman声明为“预授权”应用程序(应用程序注册>公开API>授权的客户端应用程序)。 FE的同意提示将包括任何Middleman到DownstreamServiceA的许可,这将被视为已授予。
  • 在Middleman,手动授予所需权限的同意。如果您是租户的管理员,这有时是最简单的方法。 (例如,应用程序注册> API权限>授予管理员同意)