SAML 2.0 响应验证
SAML 2.0 response verification
将我的一个应用程序与 SAML 2.0 单点登录集成。为此使用 Okta 提供程序。在 okta 中成功验证后,我收到了 base64 编码的“SAML 响应令牌”并重定向回我的应用程序。在此令牌中,我看到了我需要的所有用户详细信息,但这是我的问题。我是否需要进一步验证该响应,还是我应该只相信我收到的内容?考虑到此令牌还包含 signarure?
我的安全想法是再次联系 Okta 并验证这是否真的由 Okta 发布。不确定这是否可能。
使用NodeJS进行验证。
如果您不想在后端进行适当的令牌验证(别怪您,这很痛苦),请切换到 OIDC。这更适合前端的身份验证和授权。
但是,如果 SAML 响应被发送到后端并由后端处理,并且一些其他令牌被转发到您的应用程序,那么您应该评估验证该令牌的要求是什么。
您的问题中不清楚的是我们在讨论用户流中的哪个位置,因此我的回答有多少评论。
如果 SAML 响应令牌 是指根据 Web 浏览器被动 SSO 配置文件发布的 samlp:Response
,则响应包含断言,断言是 由身份提供者签名(此外,整个响应也可以签名)。
始终验证响应签名是一项关键的安全要求。 SAML specs 节 4.1.4.3
中提到了这一点
原因如下:在 Web 浏览器 SSO 配置文件中,身份提供者在网页中返回令牌,该网页包含带有 SAMLResponse
和 RelayState
字段的简单表单,并且一些代码可以将此表单自动发布到您的应用程序。从技术上讲,这意味着令牌在短时间内由用户的 Web 浏览器控制,这是可以更改(或伪造)令牌的地方。
因此,协议安全性在很大程度上依赖于令牌的完整性,这是通过加密签名实现的——它只是一个应用于 SAML 的普通旧 XMLDSig 签名。
作为令牌接收方,您的目标不仅是验证签名,还要检查签名的证书并将其与您希望从受信任的提供者那里获得的证书(或受信任的提供者的证书列表)进行比较。
跳过此步骤会使您的应用程序容易受到攻击:
跳过验证意味着用户可以更改断言的令牌 (add/create/delete) 声明,签名验证将失败但您跳过它
跳过证书与已知证书的匹配意味着用户可以伪造自己的断言,使用虚拟证书对其进行签名并提交给您的应用程序。签名验证步骤会成功,但您不会意识到使用了虚拟证书来签署断言
将我的一个应用程序与 SAML 2.0 单点登录集成。为此使用 Okta 提供程序。在 okta 中成功验证后,我收到了 base64 编码的“SAML 响应令牌”并重定向回我的应用程序。在此令牌中,我看到了我需要的所有用户详细信息,但这是我的问题。我是否需要进一步验证该响应,还是我应该只相信我收到的内容?考虑到此令牌还包含 signarure?
我的安全想法是再次联系 Okta 并验证这是否真的由 Okta 发布。不确定这是否可能。
使用NodeJS进行验证。
如果您不想在后端进行适当的令牌验证(别怪您,这很痛苦),请切换到 OIDC。这更适合前端的身份验证和授权。
但是,如果 SAML 响应被发送到后端并由后端处理,并且一些其他令牌被转发到您的应用程序,那么您应该评估验证该令牌的要求是什么。
您的问题中不清楚的是我们在讨论用户流中的哪个位置,因此我的回答有多少评论。
如果 SAML 响应令牌 是指根据 Web 浏览器被动 SSO 配置文件发布的 samlp:Response
,则响应包含断言,断言是 由身份提供者签名(此外,整个响应也可以签名)。
始终验证响应签名是一项关键的安全要求。 SAML specs 节 4.1.4.3
中提到了这一点原因如下:在 Web 浏览器 SSO 配置文件中,身份提供者在网页中返回令牌,该网页包含带有 SAMLResponse
和 RelayState
字段的简单表单,并且一些代码可以将此表单自动发布到您的应用程序。从技术上讲,这意味着令牌在短时间内由用户的 Web 浏览器控制,这是可以更改(或伪造)令牌的地方。
因此,协议安全性在很大程度上依赖于令牌的完整性,这是通过加密签名实现的——它只是一个应用于 SAML 的普通旧 XMLDSig 签名。
作为令牌接收方,您的目标不仅是验证签名,还要检查签名的证书并将其与您希望从受信任的提供者那里获得的证书(或受信任的提供者的证书列表)进行比较。
跳过此步骤会使您的应用程序容易受到攻击:
跳过验证意味着用户可以更改断言的令牌 (add/create/delete) 声明,签名验证将失败但您跳过它
跳过证书与已知证书的匹配意味着用户可以伪造自己的断言,使用虚拟证书对其进行签名并提交给您的应用程序。签名验证步骤会成功,但您不会意识到使用了虚拟证书来签署断言