SSO 和 SAML - 多个服务提供商

Posted

技术标签:

【中文标题】SSO 和 SAML - 多个服务提供商【英文标题】:SSO and SAML - Multiple Services Providers 【发布时间】:2016-12-14 19:31:24 【问题描述】:

我有两个使用 Spring Security SAML 扩展保护的 Spring Boot 应用程序。这两个应用程序已经在运行。第一个 (web-ui-app) 是第二个 (services-app) 的用户界面,一个 REST API。

成功访问web-ui-app,通过身份提供者正确认证后,我尝试访问一些services-app的方法。

但是,我没有收到来自 services-app 的正确响应(JSON 响应),而是收到如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
   <body onload="document.forms[0].submit()">
      <noscript>
         <p>
            <strong>Note:</strong> Since your browser does not support javascript, you must press the Continue button once to proceed.
         </p>
      </noscript>

      <form action="https://ServiceProvider.com/SAML/SLO/Browser" method="post">
         <div>
            <input type="hidden" name="RelayState" value="0043bfc1bc45110dae17004005b13a2b"/>
            <input type="hidden" name="SAMLRequest" value="PHNhbWxwOkxvZ291dFJlcXVlc3QgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iDQogICAgSUQ9ImQyYjdjMzg4Y2VjMzZmYTdjMzljMjhmZDI5ODY0NGE4IiBJc3N1ZUluc3RhbnQ9IjIwMDQtMDEtMjFUMTk6MDA6NDlaIiBWZXJzaW9uPSIyLjAiPg0KICAgIDxJc3N1ZXI+aHR0cHM6Ly9JZGVudGl0eVByb3ZpZGVyLmNvbS9TQU1MPC9Jc3N1ZXI+DQogICAgPE5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPjAwNWEwNmUwLWFkODItMTEwZC1hNTU2LTAwNDAwNWIxM2EyYjwvTmFtZUlEPg0KICAgIDxzYW1scDpTZXNzaW9uSW5kZXg+MTwvc2FtbHA6U2Vzc2lvbkluZGV4Pg0KPC9zYW1scDpMb2dvdXRSZXF1ZXN0Pg=="/>
         </div>
         <noscript>
            <div>
               <input type="submit" value="Continue"/>
            </div>
         </noscript>
      </form>
   </body>
</html>

这是一个 SSO 对话。由于我已经通过 web-ui-app 登录,难道不应该是 services-app 和服务提供者之间的透明密钥交换吗?

我错过了什么?

【问题讨论】:

您是否将这两个项目都设置为服务提供商?您使用的是无状态安全还是会话?当您说“使用 Spring Security SAML 扩展保护”时,您能否详细说明您的意思?说前端和后端都是独立的服务提供者对吗? 是的,前端和后端都是服务提供者。 A 发现无状态服务,即其余 api,无法使用 SAML 进行保护。在这种情况下,最好的方法是在前端应用程序中使用 SAML,在其余 api 中使用带有令牌身份验证的 OpenID,对吧? 【参考方案1】:

SAML 可用于使用 REST API 保护单个应用程序,但是,拥有不共享应用程序或会话上下文的单独前端和后端是行不通的。例如,如果您有一个打包了前端的应用程序并将其配置为单个服务提供者,则会话将对后端 API 请求有效。

话虽如此,如果您将前端配置为服务提供者,您可以对 REST API 使用基于无状态令牌的安全性,正如您所提到的。这种架构是首选,因为它比会话更好。任何请求都应该能够转到任何 REST API 实例并被处理,因此您可以添加或删除 API 实例以根据需要扩展应用程序。

JSON Web Tokens (JWT) 是一个不错的选择,因为它允许您将有关用户的一些信息存储在令牌内的自定义声明中。如果其余 API 的所有实例都使用相同的共享密钥对令牌进行签名,则任何请求都可以转到任何实例,并且该实例将能够解码令牌并获取声明信息(例如用户 ID),而无需存储它在内存缓存或数据库中。

【讨论】:

以上是关于SSO 和 SAML - 多个服务提供商的主要内容,如果未能解决你的问题,请参考以下文章

身份提供商(salesforce)注销SSO时注销服务提供商(passport-saml)

面向公众的 SSO 的 SAML 版本 2 的服务提供商? [关闭]

带有 wso2 IS 的 Spring Security SAML

使用 SAML 2.0 作为 SSO 的外部身份提供者的身份服务器 4

SAML - SSO(转)

使用 spring-SAML 在 Pentaho 中多租户 SSO 登录后重定向