当前位置: 首页 > 知识库问答 >
问题:

SAML和后端REST服务身份验证

周滨海
2023-03-14

我有一个这样的应用程序工作html" target="_blank">流程

(A) 用户代理(浏览器)

假设应用服务器(B)是一个SAML服务提供者,user@domain使用Web浏览器SSO配置文件从浏览器(A)到应用服务器(B)进行身份验证。

在(B)上运行的应用程序如何向user@domain.com的REST服务(C)进行身份验证?(假设B和C都是同一IdP上的SAML SP。)

如果浏览器只是对B和C进行AJAX调用,那么就很简单了。但是,如果直接从应用程序调用REST服务,您会怎么做?

我正在努力解决的问题是:如果应用程序本身不是SAML SP,而是与之集成的(例如,使用Shibboleth SP和REMOTE_USER标头),您的应用程序可能永远不会看到SAML断言。您知道用户已登录并针对IdP进行身份验证,但无法将SAML断言传递给后端服务。

有解决办法吗?还是我运气不好?

共有2个答案

宋丰
2023-03-14

既然您说App Server B和REST service C都是具有相同SAML IdP的SAML SP,那么您必须已经有了一种机制,允许web客户端通过SAML web浏览器SSO配置文件直接(独立于B)对C进行身份验证,对吗?当这个“登录工作流”完成时,API客户端有一个auth令牌,它表示user@domain.com由IdP X验证以使用SP C”,并可用于在一段时间内验证对C的调用(直到验证令牌过期)。

但B和C是独立的服务。如果他们有不同的SAML服务提供商EntityID在同一IdP X中注册,那么IdP X不会认为这些语句是等效的:

  1. user@domain.com由IdP X验证是否使用SP C
  2. user@domain.com由IdP X验证是否使用SP B

因此,服务B不应该使用表示上述语句2的身份验证令牌(可以从其自己的SAML SSO登录工作流中获得)来获取表示上述语句1的身份验证令牌(只能从C的SAML SSO登录工作流中获得)。服务B也不可能在不失去对工作流的控制的情况下,将API客户端“传递”到服务C SAML SSO登录工作流。

另一方面,如果B和C在IdP中注册了相同的SAML服务提供商entityID,那么上面的语句1在逻辑和安全方面与上面的语句2等效。在这种情况下,最简单的解决方案是服务B和C使用相同的身份验证令牌系统。这实际上是唯一可行的方法,因为如果B和C具有相同的SAML SP entityID,那么IdP将仅为B和C配置一个ACS URL,这意味着就IdP而言,它们实际上是一个相同的SAML SP。

张通
2023-03-14

是的,没有什么可以阻止您的应用程序服务器(B)既作为服务提供商接受来自a的传入断言,又作为身份提供商,发布自己的SAML票证并转发给C。

如果您没有访问原始断言的权限,则必须在B中发出新的断言。如果您确实有访问原始断言的权限,则可以将其转发给C,如果C被配置为忽略限制断言仅对B有效的访问群体限制。

 类似资料:
  • 问题内容: 我正在努力为使用网关的REST API设计SAML2.0身份验证。在我的后端和应用程序之间使用REST。我正在使用Java Servlet过滤器和Spring。 我看到两种可能性: 每次将SAML令牌添加到标头中。 使用SAML进行一次身份验证,然后使用客户端与网关之间的会话或类似(安全对话)进行身份验证。 情况1: 这是一个很好的解决方案,因为我们仍然是RESTful,但是: SAM

  • 我已经浏览了很多帖子和文章,但没有找到一个简单的解决方案,下面我必须实现。 平台:Spring Boot 2。x、 嵌入Tomcat的x(Spring Security 5.x.x) 解决方案:使用许多客户端应用程序和许多最终用户的REST服务。 > 因此,我必须使用一次性令牌对上述应用程序进行身份验证。因此,我计划通过启用和来实现Spring OAuth2。对于每个应用程序客户端,我将生成一个令

  • 问题内容: 我正在开发一个使用Jersey框架的REST应用程序。我想知道如何控制用户身份验证。我搜索了很多地方,最近的文章是:http : //weblogs.java.net/blog/2008/03/07/authentication- jersey 。 但是,本文只能与GlassFish服务器和附加数据库一起使用。无论如何,在到达请求的REST资源之前,我是否可以在Jersey中实现一个接

  • 我正在使用C#实现一个REST web服务,它将作为云服务托管在Azure上。因为它是一个REST服务,所以它是无状态的,因此没有cookie或会话状态。 Web服务只能通过HTTPS(由StartSSL. com提供的证书)访问。 用户成功登录服务后,他们将获得一个安全令牌。该令牌将在未来的通信中提供身份验证。 令牌将包含客户端的时间戳、用户ID和ip地址。 所有通信都只能通过HTTPS进行,所

  • 我们的项目由Java后端(spring web应用程序)以及iOS和Android客户端应用程序组成。现在我们需要向Java后端添加客户端应用程序的身份验证。其想法是首次使用外部web服务注册用户。在这一步中,用户提供完整的凭证(登录和“大”密码),并选择一些PIN进行进一步授权。在这个主要步骤成功完成后,用户应该能够使用他的登录名和PIN(他之前自己选择的)进行身份验证。这些登录名和pin应该存

  • 问题内容: 在使用Java EE 6的Web应用程序上,我想将某些功能作为Json Rest Service公开。我想使用身份验证令牌进行登录,用户将发送其用户名,密码,服务器将发送回令牌,该令牌将用于授权用户在给定时间内的进一步请求。 到目前为止,有几个问题困扰着我; 当服务器创建令牌并将其发送给客户端时,服务器是否应该使用像哈希表这样的东西作为用户ID令牌对将其保存在DB或Bean中? 我可以