在IdentityServer3中,如何在自定义TokenHandleStore实现中将声明链接到令牌?

时间:2017-01-21 18:39:42

标签: identityserver3

我正在实施IdentityServer3应用程序,同时密切关注EntityFramework IdentityServer3解决方案。但问题是这个......

当保存令牌对象时,如果在保存令牌here时索赔没有以某种方式链接到令牌,则当客户端调用资源服务器时,它将不可避免地导致未经授权的请求。从数据库加载令牌时会发生这种情况,因为最初附加到令牌的声明不再存在(因为它们未被保存)。

IdentityServer3中的内存解决方案没有此问题,因为您的对象保留在内存中,因此令牌对象内的声明列表保持"附加"到令牌。有关内存解决方案,请参阅here

如果您在保存时未将声明链接到令牌,则在从数据库中检索到参考令牌时,无法验证该参考令牌。

我想你需要在保存令牌时保存声明和令牌之间的关系。但是,这是有问题的,因为在代码中的那一点(请参阅here),您无法轻松可靠地确定声明是否是范围声明,客户声明或用户声明。

您如何正确地将记录插入到将令牌链接到正确的声明表的加入/链接表中? 由于存在ScopeClaims表,因此ClientClaims表和UserClaims表可以有...通常与任何给定令牌相关的声明是客户,范围和用户声明的混合。

处理令牌保存的建议是什么,以便保留声明?

更新 正如John指出的那样,EF解决方案在保存时序列化整个Token对象,因此当查询Token时,会发生反序列化过程,重新补充声明和令牌中的其他字段。按照这种方法,您不必找出使用连接表或类似方法将声明链接到令牌的方法。我最初忽略了这个重要的功能。

1 个答案:

答案 0 :(得分:1)

一种方法是遵循EF实现如何处理它 - 将额外声明存储为序列化JSON字符串。由于这是由idsrv的作者写的,它也是一个很好的参考:)