如果访问令牌具有所有声明并且可以被撤消,为什么还要使用openid connect ID令牌?

时间:2019-05-05 12:30:57

标签: oauth-2.0 openid-connect asp.net-core-2.2

我正在将oauth2授权代码流与ASP.NET核心2.2 AddJwtBearer一起使用。我的令牌端点返回JWT访问权限,其中包含检查用户权限所需的所有声明。 我可以将此令牌作为任何Web API调用的载体发送,标准.net代码可以使用这些声明来检查权限,例如[Authorize(Policy="somePolicy")]。 声明之一指向我们可以撤消的内部会话密钥。

所以我的问题是为什么我需要一个ID令牌甚至刷新令牌? 声明和其他详细信息在访问令牌中,因此ID令牌又会添加什么呢? 如果该信息在Auth令牌中,则不得不使用对userinfo端点的进一步调用来浪费时间吗? 如果我可以撤消Auth令牌指向的会话,那么肯定不需要刷新令牌,并且可以使用更长的Auth令牌吗?

我已经阅读了很多示例和比较,但是在oauth2和使用openid connect增强的功能之间,大多数计算似乎是使用非常基本的oauth2而不使用JWT等,因此被夸大了。 所以我不清楚什么时候都使用相同的授权代码流和JWT令牌,在我的情况下团队使用ID令牌的优势是什么?

1 个答案:

答案 0 :(得分:2)

鉴于您的情况,看来OpenId Connect对于您的情况不是必需的。当您实施单点登录(SSO)时,它确实增加了价值。在这种情况下,身份令牌也可以用于SSO注销。

在访问令牌中具有关于身份的其他声明也很浪费。每次呼叫都必须发送所有这些信息。特别是在您仅需要一次信息的情况下(SPA可能会将信息保留在内存中)。最好有一些api(端点)在请求时公开信息。

关于访问令牌,您无法撤消它。您也许可以撤消授权,但是访问令牌在到期之前一直保持有效。您希望无效的访问令牌在评估策略之前尽快在管道中短路。

请注意,api可以通过使用内部会话密钥来撤消访问权限的情况并不常见。大多数api是“无会话”的,并且完全依赖于访问令牌。因为这是JWT的目的,所以它是独立的,不必联系权威机构来验证令牌。

也许您可以使用长期访问令牌,因为在您的情况下,授权是在另一个级别确定的。但是,您能够检测到令牌何时遭到泄露吗?您要去哪里检查?在每个api和客户端中?还是您宁愿让当局来处理它(单一职责)?

实施安全性时,您应该查看设计,职责,在何处做什么。让颁发令牌的授权机构负责身份验证和客户端/资源授权。 Api是实现业务规则(策略)的资源,可以处理(用户)授权。

令牌寿命长的问题是,当令牌落入错误的人手中时,它将允许访问直到令牌过期,或者直到您检测到错误为止。寿命短的令牌始终允许访问很短的时间,这使得黑客在其可使用的时间内获取令牌几乎不值得。

使用短期访问令牌,您将必须使用刷新令牌。权威机构可以在每次呼叫中验证是否应发出新的访问令牌。当然,这里的计数相同,这仅适用于您实际验证请求的情况。令牌本身并不安全。您必须添加某种级别的安全性,例如检查IP地址。但是拥有处理此权限并使用一次性刷新令牌的权限确实可以增加安全性。

根据我对oidc / oauth2的经验,访问令牌主要用于授予客户端应用程序对资源(代表用户)的访问权限。范围声明定义了可访问的功能,子声明标识了用户。

授权可以在不同的级别上实现,而不必成为访问令牌的一部分。实际上,权限根本不应该是访问令牌的一部分。

因此您的设置可能很好。但是由于已经提到的原因,我不会使用长期访问令牌。另外,它们无法管理。当流中的某些内容发生变化时,例如,您无法更新访问令牌。添加范围时。