OpenId Connect 如何保护资源服务器免受客户端模拟?

Posted

技术标签:

【中文标题】OpenId Connect 如何保护资源服务器免受客户端模拟?【英文标题】:How can OpenId Connect protect resource server from client impersonation? 【发布时间】:2017-11-13 09:28:51 【问题描述】:

我知道 openId connect 可以发出一个可以被 客户端(依赖方)对最终用户进行身份验证。但是如何使用它来保护资源服务器免受客户端模拟呢? (我觉得这个问题和Client impersonation in OAuth application with implicit authorization很像)

比方说,有一个SPA(android + webAPI),客户端(android app)实现了openid connect隐式流,直接使用access token与资源服务器(web api)通信。 应用程序首先将最终用户重定向到 openid 提供者,并获得 id 令牌和访问令牌。 但是,有一个恶意应用窃取了访问令牌并冒充客户端与资源服务器进行通信。

没有id token,资源服务器如何知道access token是否被盗?

【问题讨论】:

【参考方案1】:

我不认为它可以。正如您所说,OpenID Connect 是关于向客户端验证最终用户的身份。它没有说明向资源服务器验证客户端的任何内容。客户端和资源服务器之间的关系纯粹是 OAuth2,资源服务器通常能做的就是检查访问令牌是否由授权服务器颁发。 OAuth2 规范的Section 10.16 还讨论了访问令牌如何与隐式授权一起被滥用。

使用隐式授权不能保证客户端不是恶意的。它甚至没有被授权服务器认证。这与授权码授权不同,客户端直接向令牌端点进行身份验证。即使这样,使用普通 OAuth2 客户端也不会对资源服务器进行身份验证,因此资源服务器不知道哪个客户端正在发送请求。

OAuth2 省略了访问令牌是如何实现或验证的,因此根据详细信息,资源所有者可能能够从令牌中获取有关哪个客户端请求它的更多信息。但是对于隐式授权,您没有任何保证。

【讨论】:

是的,OIDC 不对访问令牌的安全性负责。查看相关问题here【参考方案2】:

也许我错了,但这不是客户秘密的原因吗?恶意应用现在不应该是客户端密钥,因此不应该能够成功地向资源服务器发出请求。

【讨论】:

以上是关于OpenId Connect 如何保护资源服务器免受客户端模拟?的主要内容,如果未能解决你的问题,请参考以下文章

openid connect owin 如何验证来自 Azure AD 的令牌?

Spring Security 和 OpenID Connect (OIDC)

如何验证每个用户可以使用 OAuth 和 OpenID Connect 访问哪些资源?

OAuth2/OpenID Connect 保护 API 的自动化 API 测试

在 OpenID Connect 中,是不是可以将 id 令牌而不是访问令牌传递给资源服务器进行授权?

使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端