Asp.net web api Azure AD exchange access_令牌,id_令牌v.1.0终结点

Asp.net web api Azure AD exchange access_令牌,id_令牌v.1.0终结点,asp.net-web-api,oauth-2.0,azure-active-directory,single-page-application,openid-connect,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\u令牌和access\u令牌 现在,我们不希望SPA根据SPA应用程序中收到的id\u令牌执行访问控制决策 相反,SPA将access\u令牌发送到后端web API以访问它,现在我们希望后端web API根据id\u令牌中找到的角色声明做出访问控制决策,但后端没有从SPA接

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

我正在使用Azure AD(v1.0端点)、单页应用程序(SPA)和web API。SPA使用OpenID Connect建立用户身份,对用户进行身份验证,并接收用于后端web API的
id\u令牌
access\u令牌

现在,我们不希望SPA根据SPA应用程序中收到的
id\u令牌
执行访问控制决策

相反,SPA将
access\u令牌
发送到后端web API以访问它,现在我们希望后端web API根据
id\u令牌
中找到的
角色
声明做出访问控制决策,但后端没有从SPA接收到


问题是,后端web API是否可以将收到的
access\u令牌
发送到Azure AD令牌端点,并为用户接收相关的
id\u令牌
,以便后端web API接收包含用户的
角色
声明的
id\u令牌
,为了做出访问控制决策?

在您描述的方法中有几个问题:

  • 应用程序角色将在本机客户端应用程序(SPA)上定义。虽然您可以在清单中定义应用程序角色,但您会注意到Azure门户不允许您将用户或组分配给本机客户端应用程序。(这是有道理的,因为正如您正确地说的,您不想在本机客户端应用程序中执行任何访问控制。)
  • 您无法执行您所描述的操作(将针对一个观众的
    access\u令牌
    交换为针对不同观众的
    id\u令牌
    )。您可以使用令牌交换的一些变体,但在这种情况下,它们都不能帮助您
  • 相反,您应该做的是在web API上定义应用程序角色。然后,将用户分配给web API的相应应用程序角色。当这些用户登录到SPA,SPA代表他们获得一个访问令牌到web API时,您会注意到访问令牌将包含
    角色
    声明,并填充相应的值

    总结:

  • 在web API的应用程序注册下,在应用程序清单中(或直接在应用程序对象上,使用(例如)Azure AD PowerShell)定义您的
    appRoles
  • 在web API的企业应用程序下,为用户和/或组分配相应的应用程序角色,并选择是否需要分配应用程序角色*。(或直接在ServicePrincipal对象上执行此操作。)
  • 在SPA(应用程序对象)的应用程序注册下,将web API添加为所需权限
  • *如果您选择要求为web API分配应用程序角色(在企业应用程序>属性下),SPA将无法为未分配给web API应用程序角色的用户获取访问令牌。如果您选择不要求分配应用程序角色,则未分配应用程序角色的用户将能够登录SPA,SPA将能够代表他们获取web API的访问令牌,但访问令牌将不包含
    角色
    声明