Azure AD交换access_token,带有id_token v.1.0端点

时间:2018-03-09 20:10:05

标签: asp.net-web-api oauth-2.0 azure-active-directory single-page-application openid-connect

我将画一个场景,需要一些建议:

我使用的是Azure AD(v1.0端点),单页应用(SPA)和Web API。 SPA使用OpenID Connect建立用户身份,对用户进行身份验证,并为后端Web API接收id_tokenaccess_token

现在,我们不希望SPA根据SPA应用中收到的id_token做出访问控制决策。

相反,SPA会将access_token发送到后端Web API以访问它,现在我们希望后端Web API根据找到的roles声明做出访问控制决策在id_token中,但后端未从SPA收到。

问题是,后端Web API是否可以将收到的access_token发送到Azure AD令牌端点并为用户接收相关的id_token以便后端Web API收到包含用户id_token声明的roles,以便做出访问控制决定?

1 个答案:

答案 0 :(得分:1)

您所描述的方法存在一些问题:

  1. 将在本机客户端应用程序(SPA)上定义应用程序角色。虽然您可以在清单中从技术上定义应用程序角色,但您会注意到Azure门户不会让您将用户或组分配给本机客户端应用程序。 (哪种方式有道理,因为正如您正确地说的那样,您不想在本机客户端应用中执行任何访问控制。)
  2. 您无法执行您所描述的内容(为一个受众群体换取access_token,为不同的受众群体换取id_token。您可以 做一些令牌交换的变体,但在这种情况下,它们都无法帮助您。
  3. 相反,您应该做的是在Web API上定义应用程序角色 。然后,将用户分配给Web API的相应应用程序角色。当这些用户登录SPA并且SPA获得代表他们访问Web API的访问令牌时,您会注意到访问令牌将包含roles声明,并填充了相应的值。< / p>

    汇总:

    1. 在Web API的App注册下,使用(例如)Azure AD PowerShell直接在应用清单中定义appRoles(或直接在Application对象上)。
    2. 在用于Web API的企业应用下,将用户和/或组分配到其相应的应用角色,并选择是否需要应用角色分配*。 (或者直接在ServicePrincipal对象上执行此操作。)
    3. 在SPA的应用注册(应用程序对象)下,添加Web API作为必需的权限。
    4. *如果您选择要求Web API的应用角色分配(在Enterprise apps&gt; Properties下),则SPA将无法为未分配给Web API的应用角色的用户获取访问令牌。如果您选择来要求分配应用角色,则未分配应用角色的用户将能够登录SPA,并且SPA 能够获得访问权限他们代表Web API使用令牌,但访问令牌包含roles声明。