Authentication OAuth客户端凭据流-作为声明调用客户端详细信息

Authentication OAuth客户端凭据流-作为声明调用客户端详细信息,authentication,oauth-2.0,identityserver4,identity,Authentication,Oauth 2.0,Identityserver4,Identity,我在工作场所有一个Identity Server 4.0实现。在隐式和身份验证代码流之上,我们计划使用客户端凭证流进行API到API调用身份验证 很少有API需要记录调用它的人(调用API的名称)。我已经做了很多挖掘工作,但找不到一个令人信服和安全的方法来做这件事 在我的理解中,在客户机信任流中,客户机将仅使用客户机机密访问ID。显然,这将使IDS几乎不可能知道是谁在呼叫它。我说得对吗?是否有任何方法可以了解客户端,以便将一些id声明添加到令牌中 欢迎任何建议 编辑:为了详细说明我的问题并更好地

我在工作场所有一个Identity Server 4.0实现。在隐式和身份验证代码流之上,我们计划使用客户端凭证流进行API到API调用身份验证

很少有API需要记录调用它的人(调用API的名称)。我已经做了很多挖掘工作,但找不到一个令人信服和安全的方法来做这件事

在我的理解中,在客户机信任流中,客户机将仅使用客户机机密访问ID。显然,这将使IDS几乎不可能知道是谁在呼叫它。我说得对吗?是否有任何方法可以了解客户端,以便将一些id声明添加到令牌中

欢迎任何建议

编辑:为了详细说明我的问题并更好地解释我对这个特定OAuth流的理解:

好的,让我说清楚。假设API X必须调用API Y

其顺序如下: 1 X转到具有客户机Id和客户机机密的Id,用于Y。 2 IDS验证客户端Id和密码,并向X颁发访问令牌 3 X使用给定的访问令牌调用Y

在上面的步骤2中,根据OAuth 2.0的客户机凭据流,除了客户机ID和客户机机密之外,X不需要提供任何东西。现在,如果API Z想要与Y对话,它将转到具有相同客户端ID和相同机密的ID

如果IDS无法识别身份验证调用是否来自X或Z,它如何在已颁发的令牌中添加任何附加声明


因此,Y知道调用是否来自X或Z的唯一其他方法是,X或Z在标题或url或post数据中告诉自己他们是谁,这使得通过客户端信任流进行授权的整个目的无效。请记住,我的问题不涉及身份验证。

有两种方法:每个实例使用唯一的客户端凭据API X、API Z是独立的客户端,或者使用相同的客户端ID和/或将其留给客户端提供信息

使用unique clientid,您可以在ClientClaims表中添加有关客户端的信息作为声明,例如声明“ApiName”、“ApiName”

此声明被添加到访问令牌中,并在接收API中可用

在此场景中,客户端凭据用作id/密码,允许客户端“登录”

另一种方法是对所有API使用相同的clientid。现在由客户提供信息

一种方案是发布可用于标识客户端的apikey,例如guid。您可以在每次通话时发送

此外,还有另一种选择,即添加自定义端点。不要使用客户端凭据,而是实现自己的端点

使用,您可以请求所需的信息并将其转换为有效的访问令牌

通过ExtensionGrantValidationContext对象,您可以访问传入的令牌请求—既可以是已知的已验证值,也可以通过原始集合访问任何自定义值


使用APIKEY“扩展”客户端凭据流可能是个好主意。

有两种方法:每个实例使用唯一的客户端凭据API X、API Z是独立的客户端,或者使用相同的客户端ID和/或将其留给客户端提供信息

使用unique clientid,您可以在ClientClaims表中添加有关客户端的信息作为声明,例如声明“ApiName”、“ApiName”

此声明被添加到访问令牌中,并在接收API中可用

在此场景中,客户端凭据用作id/密码,允许客户端“登录”

另一种方法是对所有API使用相同的clientid。现在由客户提供信息

一种方案是发布可用于标识客户端的apikey,例如guid。您可以在每次通话时发送

此外,还有另一种选择,即添加自定义端点。不要使用客户端凭据,而是实现自己的端点

使用,您可以请求所需的信息并将其转换为有效的访问令牌

通过ExtensionGrantValidationContext对象,您可以访问传入的令牌请求—既可以是已知的已验证值,也可以通过原始集合访问任何自定义值


也许用APIKEY“扩展”客户端凭据流是一个好主意。

这是用于批处理作业的吗?如果是这样,那么为什么不为每个批使用单独的客户端id呢。如果是最终用户调用,为什么在最终用户通过授权流时获得的访问令牌不能用于所有调用?为什么API Z必须使用与API X相同的clientid?这是否用于批处理作业?如果是这样,那么为什么不为每个批使用单独的客户端id呢。如果是最终用户调用,为什么最终用户通过授权流获得的访问令牌不能用于所有调用?为什么API Z必须使用与API X相同的clientid?谢谢Ruard
谢谢你的回答。但是,请注意,IDS无法知道哪个客户端正在调用它,除非您使用ip进行了一些肮脏的攻击。@Dharmesh您所说的IDS无法知道哪个客户端正在调用它是什么意思?这又有什么关系呢?记录调用的不是api吗?无论如何,在请求ClientCredentialsToken时,每个api应该是唯一的clientid被发送到IdentityServer。调用的api可以记录调用以及用户中可用的添加声明。声明收集感谢您的回答,ExtensionGrant会很好地解决我的问题。感谢Ruard的回答。但是,请注意,IDS无法知道哪个客户端正在调用它,除非您使用ip进行了一些肮脏的攻击。@Dharmesh您所说的IDS无法知道哪个客户端正在调用它是什么意思?这又有什么关系呢?记录调用的不是api吗?无论如何,在请求ClientCredentialsToken时,每个api应该是唯一的clientid被发送到IdentityServer。调用的api可以记录调用以及用户中可用的添加声明。声明收集感谢您的回答,ExtensionGrant将很好地解决我的问题。