使用SAML进行REST API身份验证

22

我正在为使用网关的REST API设计SAML2.0身份验证而苦恼。我的后端和应用程序之间使用REST。我正在使用Java Servlet过滤器和Spring。

我看到两种可能性:

  1. 每次将SAML令牌添加到标头中。

  2. 使用SAML进行一次身份验证,然后在客户端和网关之间使用会话或类似的安全对话。

情况1:这是一个不错的解决方案,因为我们仍然符合RESTful的原则,但是:

  • SAML令牌相当大,可能会由于标头过大而产生问题。
  • 重放令牌并非出于安全考虑最佳方法。

情况2:它不再是无状态的,并且我必须与客户端建立联系。由于使用了网关,底层服务仍然可以符合RESTful的原则。

尽管情况2不遵循REST的约束条件,但它似乎是更好的选择。

是否有人已经做过,能给我一些指导(针对设计或实现)?

是否有更好的使用SAML的方式?

任何帮助或建议都会受到欢迎。


使用第二种方法。许多服务提供商无论如何都会拒绝重放的令牌。这是用于验证用户还是您的客户端软件? - tom
这是用于验证用户的。 - Nereis
如果您愿意使用SAML替代方案,也可以尝试使用OAuth2进行查看。 - Yusuf Khan
不存在SAML令牌这样的东西。你是不是想把SAML断言放在授权头中?因为SAML断言只能被消耗一次,因为它有一个唯一的ID(以防止重放攻击)。此外,每个SAML断言通常只有一个很短的有效时间窗口(通常只有几分钟)。 - gx0r
2个回答

14

哦,我之前没有听说过那个。 - tom
1
这似乎是正确的方式。许多大型网络公司使用OAuth和JSON Web Token(JWT)来保护其REST服务。还可以参考此草案:http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-05#page-21,以及安全令牌服务(STS)关键字。 - Nereis
1
那么,我如何使用SAML2来验证OAuth2提供程序? - Josh C.
您可以使用STS进行翻译。它将接受OAuth2令牌并生成SAML2令牌。 - Nereis
签名/加密的声明如何传递?调用方是否必须解密它们? - Bhushan Karmarkar
令牌可以通过浏览器传递,也可以由代理添加。除了需要进行两次验证之外,它与标准的身份验证流程没有区别。 - Nereis

0

此外,您可以生成一个JWT令牌并将其放入SAML属性中:从此时起,您可以在HTTP标头中传递JWT。

这有点像将OAuth与SAML混合在一起,但如果您仍然需要后者进行身份验证,则可以采用这种方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接