如何在 Spring 中验证 SM_USER header siteminder 的安全预身份验证

How to validate SM_USER header in Spring Security preauthentication for siteminder

我正在尝试使用站点管理员的 pre-authentication 安全性创建一个安全的 spring 休息 api。

我已经尝试了一个解决方案,我得到 SM_USER,当我通过添加新的 header SM_USER 和随机值在邮递员中测试它时,它似乎工作正常。

如果你不提供 header 我收到一个错误 org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException: SM_USER header not found in request which is valid.

但是我如何确定这是安全的?如果有人知道我休息的 URL api 可以毫无问题地调用它。我应该检查 spring 中的其他内容还是只有 siteminder 提供用户身份验证?

front-end SiteMinder 网络代理保证 session 有效 - 您 必须 通过 server/network 配置确保您的如果不先通过 SiteMinder Web 代理,则无法直接访问应用程序。

此外,SiteMinder 断言多个 headers。 SM_USER 不应单独使用,因为在某些情况下,当用户实际上没有有效的 session 时,Web 代理可能会断言它。相反,你应该首先寻找SM_SERVERSESSIONID的存在(non-blank),它只有在session有效时才存在。

最后,我通常尽量避免使用 SM_USER - 因为 SM_USER 实际上根本不是用户属性,而是 "the login identifier used for authentication"。如果 SiteMinder 通过联合身份验证(例如 SAML)或 x509 身份验证对用户进行身份验证,SM_USER 将与使用登录表单时有很大不同。相反,最好在 SiteMinder 中设置一个 "universal id",这是一个用户属性,并在 header 中显示为 SM_UNIVERSALID。您的 SiteMinder 管理员将知道如何执行此操作(并且可能已经知道 - 查看您是否已经有 SM_UNIVERSALID header 可用)。

另请注意,在某些 SiteMinder 配置中,下划线不会出现在 header 名称中(使用下划线在 SiteMinder 中称为 "legacy" header 模式),因此您可能希望根据 header 名称使您的应用程序可配置,例如SMSERVERSESSIONIDSMUSERSMUNIVERSALID

如果你想以编程方式re-validate一个session,你可以使用SiteMinder AgentAPI或RESTAPI,或者看看我公司的产品"SSO/Rest" 它为 SiteMinder 和其他 SSO 提供商提供了一套全面的统一 REST 接口 (http://www.idfconnect.com)。

HTH!

-理查德