Azure active directory 基于OIDC的混合SPA客户端&x2B;OAuth服务器客户端场景?

Azure active directory 基于OIDC的混合SPA客户端&x2B;OAuth服务器客户端场景?,azure-active-directory,azure-ad-b2c,openid-connect,Azure Active Directory,Azure Ad B2c,Openid Connect,我正试图规划最佳方式,以实现以下发展: 组成部分: SPA客户机:与以下人员进行通信: 基于API的服务器:由同一组织开发 SPA和服务器都是第三方API的客户端,例如: AAD图形API 在上述情况下,以下各项是否正确: SPA使用OIDC隐式流登录到AAD,并返回两个令牌:token+id\u token SPA将这两个令牌保存在独立的存储中 SPA与后端服务器的API通信。 在授权标头中将令牌作为承载令牌传递 Q:在OAuth 2.0框架中,访问令牌不应在私人客户端之外共享,

我正试图规划最佳方式,以实现以下发展:

组成部分:

  • SPA客户机:与以下人员进行通信:
  • 基于API的服务器:由同一组织开发
SPA和服务器都是第三方API的客户端,例如:

  • AAD图形API

在上述情况下,以下各项是否正确:

  • SPA使用OIDC隐式流登录到AAD,并返回两个令牌:
    token
    +
    id\u token
  • SPA将这两个令牌保存在独立的存储中
  • SPA与后端服务器的API通信。
    • 在授权标头中将令牌作为承载令牌传递
    • Q:在OAuth 2.0框架中,访问令牌不应在私人客户端之外共享,这是正确的吗?但在OIDC中,我们采取这种自由,因为SPA被视为同一系统的一个组件,只要我们不公开客户端id,就可以了
    • Q:是否也将
      id\u令牌传回?或者,最好将其保存在SPA端,因为服务器只需要从access_令牌的JWT获取用户id的
      sub
    • Q:如果发送,如何发送?!?如果授权标头已用于访问令牌
    • Q:这让我很困惑:后端服务器如何知道用户的作用域?OAuth 20框架和OIDC协议都没有指定
      scp
      属性是协议的一部分。一些操作(例如:AAD)不提供内省终点。肯定不仅仅是承认代币是不可侵犯的,不是吗
    • Q:如果需要,后端服务器是否可以获得
      id\u令牌(可能是为了获得用户的电子邮件地址)?
      
      • Q:怎么做?是否通过执行/token请求,提供
        令牌
        ,以获取
        id\u令牌
        ,只要令牌未过期就可以
  • 需要连接到OAuth的SPA将为对AAD的调用请求一个单独的OAuth访问令牌。这些数据也将缓存在隔离存储中

  • Q:如果Web服务要代表SPA的用户代理对AAD的请求,那么客户端必须首先确保(在SPA端)其第一个令牌已被授予额外的作用域——将AAD作用域添加到用于访问API服务器作用域的作用域中,这是否正确

  • Q:如果API Web服务代表服务调用AAD,而不引用最终用户(例如:webjob,或在最终用户登录之前),那么调用将必须使用客户端凭据流? 在上述情况下,SPA和API服务器之间不会使用cookie。这是一种最佳方法吗

隐式流意味着令牌将过期…并且将无法刷新或“记住我”。SPA是否曾调用执行授权代码授予流的Web服务器页面,然后将身份验证令牌返回给服务器?这样,分布式客户端的两半都有相同的
令牌
s

如果有的话…有什么例子吗?!线索


  • Q:我一直难以理解的一个问题是:在windows中,声明显示了用户拥有的范围。它如何使用这些信息在缓存中找到正确的令牌?或者只是不相关——它使用“访问群体”属性在目标客户机上查找该用户的唯一缓存,并附加该缓存

非常(非常!*)感谢您对上述内容的所有更正/建议


*10年来,我从未像OIDC/OAuth RFCs那样被协议/框架弄得如此慌乱

对于AAD,其他IDP可以以不同的方式处理问题

问:在OAuth 2.0框架中,它声明访问令牌不应在私有客户端之外共享,这是正确的——但在OIDC中,我们采取这种自由,因为SPA被视为同一系统的一个组件,只要我们不公开客户端id,这就可以了

我不确定是否符合官方规范,但使用访问令牌从SPA/本机客户端访问后端API是非常典型的。 客户端id是相当公开的信息,任何人都可以从您的身份验证重定向URL中找到它

问:是否也将id_令牌传递回?或者,最好将其保存在SPA端,因为服务器只需要从access_令牌的JWT获取用户id的子对象

通常不会,id令牌是用于前端的

这让我感到困惑:后端服务器如何知道用户拥有哪些作用域?OAuth 20框架和OIDC协议都没有指定scp属性是协议的一部分。一些操作(例如:AAD)不提供内省终点。肯定不仅仅是承认代币是不可侵犯的,不是吗

您可以使用如下AAD在API中实现自定义角色:。 然后可以将这些角色分配给用户。 然后,访问令牌将具有这些角色。 通过使用AAD验证签名+受众+到期时间+颁发者来检查令牌有效性

如果需要,后端服务器是否可以获得id_令牌(可能是为了获得用户的电子邮件地址)

如果是AAD,则不会。id令牌仅在用户身份验证后提供。 使用AAD,您可以调用Microsoft Graph API以获取有关用户的更多信息

问:如果Web服务要代表SPA的用户代理对AAD的请求,那么客户端必须首先确保(在SPA方面)它的第一个令牌已被授予额外的作用域——将AAD作用域添加到它用来访问API服务器作用域的作用域中,这对吗

<