2

我们有一个服务器,其中包含大约十几个小应用程序,每个应用程序都位于服务器自己的子文件夹中(//URL/app1、//URL/app2 等)。

我已经完成了基本的 SSO 身份验证往返工作。我使用我的 IDP 设置了我的帐户,并将响应设置为转到一个公共登录页面 (ACS URL)。由于着陆页当前与所有应用程序共享,因此它位于与应用程序不同的单独文件夹中 (//URL/sso/acsLandingPage.cfm)

我现在正在开发我的第一个应用程序。我可以检测到用户没有登录,所以我做了一个initSAMLAuthRequest(idp, sp, relayState: "CALLING_PAGE_URL")然后出去,验证,然后返回到登录页面。

但是如何重定向回我的目标应用程序并告诉它用户已通过身份验证?

如果我只是做一个<cflocation url="CALLING_PAGE_URL" />原始应用程序不知道 SAML 请求。

我可以在原始应用程序中调用一个函数来判断当前浏览器/用户是否有一个打开的会话?

我是否需要为每个应用程序设置单独的 SP,而不是一个通用的登录页面,每个应用程序都有自己的登录页面,以便它可以设置会话变量以传回主应用程序?(IDP 将我们的应用程序视为“一台服务器”,如果这是处理此问题的最佳方式,我可以获得单独的密钥)。

我目前对 ACS 登录页面的工作想法是解析 relayState URL 以找出哪个应用程序启动了 init 请求,然后执行以下操作:

ACSLandingPage.cfm

<cfset response = processSAMLResponse(idp, sp) />
<cfif find(response.relaystate, 'app1')>
   <cfapplication name="app1" sessionmanagement="true" />
<cfelseif find(response.relaystate, 'app2')>
   <cfapplication name="app2" sessionmanagement="true" />
</cfif>

<cfset session.authenticated_username = response.nameid />
<cflocation url="#response.relaystate#" />

不是很理想,但我认为它可能会起作用。

我希望我只是忽略了一些简单的事情,并且非常感谢我能得到的任何帮助。

编辑:我在 ACSLandingPage 中使用 <cfapplication 的上述想法不起作用,因为 <cfapplication 不断尝试将其分配给新会话,因此当我重定向回原始应用程序时,它认为它在不同的会话中,所以不会有权访问原始 session.authenticated-username。

4

0 回答 0