基于混合OIDC的SPA客户端+ OAuth服务器客户端方案?

时间:2018-08-06 00:03:05

标签: azure-active-directory azure-ad-b2c oidc

我正在尝试规划最佳方法以进行以下开发:

组件:

  • SPA客户端:与以下设备进行通信:
  • 基于API的服务器:由同一组织开发

SPA和服务器都是第三方API的客户端,例如:

  • AAD Graph API

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

  • SPA使用OIDC隐式流登录到AAD,并返回两个令牌:token + id_token
  • SPA将这两个令牌保留在隔离的存储中。
  • SPA与后端服务器的API通信。
    • 在授权标头中将令牌作为承载令牌传递。
    • 问:,它更正了以下问题:在OAuth 2.0 Framework中,它指出访问令牌不应该在私有客户端之外共享。但是在OIDC中,我们采用了自由,因为SPA被视为同一系统的组成部分,只要我们不公开客户端ID,适度就可以了吗?
    • 问:也将id_token传回了吗?还是最好将其保留在SPA端,因为服务器不需要多于sub的用户ID,它是从access_token的JWT获取的。
    • 问::如果已发送,如何?!?是否已将Authorization标头用于访问令牌?
    • 问:这使我感到困惑:后端服务器如何知道用户的作用域? OAuth 20框架和OIDC协议均未指定scp属性是该协议的一部分。并且某些OP(例如:AAD)不提供自省端点。除了接受令牌不可篡改之外,还必须有更多,不是吗?
    • :如果需要,后端服务器是否可以使用id_token(也许可以获取用户的电子邮件地址)?
      • :如何?只要令牌未过期,是否通过执行/ token请求并提供token来获得id_token来完成?
  • 需要连接到OAuth的SPA将请求单独 OAuth访问令牌,以访问AAD。那也将被缓存在隔离的存储中。

  • Q :如果Web服务要代表SPA的用户向AAD代理请求,客户必须首先在SPA方面确保-它的第一个令牌已被授予其他作用域-将AAD作用域添加到它用来获取API服务器作用域的作用域。

  • Q :如果API Web服务将代表该服务调用AAD,而没有引用最终用户(例如:Webjob,或者在最终用户登录之前),则电话将不得不使用客户端凭据流? 在以上内容中,SPA和API服务器之间不会使用cookie。那是一种最佳方法吗?

隐式流程意味着令牌将过期...并且将无法刷新或“记住我”。 SPA是否有可能调用执行授权码授予流的WebServer页面,然后将Auth令牌返回给服务器?这样,分布式客户端的两半都具有相同的token

如果是...任何示例?潜在客户?


  • :我一直很难理解一个问题:在Windows中,声明显示了用户的范围。它如何使用这些信息在缓存中找到正确的令牌?还是不相关-它使用Audience属性在该目标客户端上查找该人的唯一缓存,并将其附加?

非常(非常!*)非常感谢您对上述内容进行的任何更正/建议。

*十年来,我从未像OIDC / OAuth RFC那样被协议/框架所困扰。

1 个答案:

答案 0 :(得分:1)

正在为AAD进行答疑,其他IdP可以以不同的方式处理事情。

  

Q:它纠正了以下问题:在OAuth 2.0 Framework中,它指出访问令牌不应在私有客户端之外共享-但是在OIDC中,我们采用这种自由是因为SPA被视为同一系统的组成部分,只要我们不公开客户端ID,就可以了吗?

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

  

问:还传回id_token吗?还是将其更好地保留在SPA方面,因为服务器只需要从access_token的JWT获取的sub-sub身份即可。

通常不,id令牌用于您的前端。

  

这让我很困惑:后端服务器如何知道用户的作用域? OAuth 20 Framework和OIDC协议均未指定scp属性是该协议的一部分。并且某些OP(例如:AAD)不提供自省端点。除了接受令牌不可篡改之外,还必须有更多,不是吗?

您可以使用AAD在API中实现自定义角色,例如:https://joonasw.net/view/azure-ad-authentication-aspnet-core-api-part-2。 然后可以将这些角色分配给用户。 然后,访问令牌将具有这些角色。 通过使用AAD验证签名+受众+到期时间+发行者来检查令牌的有效性。

  

如果需要,后端服务器是否可以使用id_token(也许是获取用户的电子邮件地址)?

对于AAD,否。仅在用户认证后才提供id令牌。 使用AAD,您将调用Microsoft Graph API以获得有关用户的更多信息。

  

Q:如果Web服务要代表SPA的用户将请求代理到AAD,是否正确,客户端必须首先在SPA方面确保其第一个令牌已被授予其他范围- -将AAD范围添加到用于获取API服务器范围的范围。

不确定我是否遵循此规则。 客户端收到的令牌不适用于AAD / MS图。 因此,它将不包含那些范围。 您的API可以将收到的令牌交换为MS Graph的令牌,其中包含该令牌的授予范围。

  问:如果API Web服务将代表该服务对AAD进行调用,而没有引用最终用户(例如:Webjob,或者在最终用户登录之前),则该调用将必须使用客户端凭据流?在以上内容中,SPA和API服务器之间不会使用cookie。那是一种最佳方法吗?

如果您只想将呼叫作为服务进行,则客户端凭据流是必经之路。

  

隐式流程意味着令牌将过期...并且将无法刷新或“记住我”。 SPA是否有可能调用执行授权码授予流的WebServer页面,然后将Auth令牌返回给服务器?这样,分布式客户端的两个半部都具有相同的令牌?

ADAL.JS / MSAL.JS(通常用于带有AAD的SPA的库)使用隐藏的iframe通过prompt=none获取新令牌。 这取决于用户与AAD的活动会话。

  问:我一直很难理解一个问题:在Windows中,声明显示了用户的范围。它如何使用这些信息在缓存中找到正确的令牌?还是无关紧要的?它使用Audience属性在该目标客户端上查找该人的唯一缓存,并将其附加?

它使听众了解令牌的用途。 主题索赔将告诉您获取令牌的本金。 例如,ADAL的API允许您告诉您要调用的资源(=受众),以及要作为用户(如果适用)的身份。 然后,它会在其令牌缓存中找到正确的令牌。


我希望这至少回答了您的一些问题:)