我正在尝试规划最佳方法以进行以下开发:
组件:
SPA和服务器都是第三方API的客户端,例如:
在上述情况下,是否正确:
token
+ id_token
id_token
传回了吗?还是最好将其保留在SPA端,因为服务器不需要多于sub
的用户ID,它是从access_token的JWT获取的。scp
属性是该协议的一部分。并且某些OP(例如:AAD)不提供自省端点。除了接受令牌不可篡改之外,还必须有更多,不是吗?id_token
(也许可以获取用户的电子邮件地址)?
token
来获得id_token
来完成? 需要连接到OAuth的SPA将请求单独 OAuth访问令牌,以访问AAD。那也将被缓存在隔离的存储中。
Q :如果Web服务要代表SPA的用户向AAD代理请求,客户必须首先在SPA方面确保-它的第一个令牌已被授予其他作用域-将AAD作用域添加到它用来获取API服务器作用域的作用域。
隐式流程意味着令牌将过期...并且将无法刷新或“记住我”。 SPA是否有可能调用执行授权码授予流的WebServer页面,然后将Auth令牌返回给服务器?这样,分布式客户端的两半都具有相同的token
?
如果是...任何示例?潜在客户?
非常(非常!*)非常感谢您对上述内容进行的任何更正/建议。
*十年来,我从未像OIDC / OAuth RFC那样被协议/框架所困扰。
答案 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允许您告诉您要调用的资源(=受众),以及要作为用户(如果适用)的身份。 然后,它会在其令牌缓存中找到正确的令牌。
我希望这至少回答了您的一些问题:)