如何为在同一服务器上运行的不同ColdFusion应用程序实现单点登录?

Dan*_* T. 7 authentication coldfusion session-variables single-sign-on coldfusion-9

我有多个CF应用程序在相同的域名下运行在同一台服务器上.其中之一,我们称之为Portal,旨在成为其他应用程序的单点登录,让我们称之为AtlasP-Body.通常,您会在session范围中设置一些变量来处理登录信息:

function Login()
{
    session.auth = structNew();
    session.auth.isLoggedIn = true;
    session.auth.id = GetCurrentUserId();
}
Run Code Online (Sandbox Code Playgroud)

但会话范围仅在一个应用程序中共享,而不是在整个服务器中共享.这意味着登录Portal的任何用户都将保持登录状态,但如果他们尝试导航到AtlasP-Body,他们将不得不再次登录.

在这种情况下,我将如何"共享"会话范围,以便服务器上的所有应用程序都可以访问它?我能想到的唯一方法是使用客户端变量并设置数据存储,以便在应用程序之间共享.然后代码变成:

function Login()
{
    client.auth = structNew();
    client.auth.isLoggedIn = true;
    client.auth.id = GetCurrentUserId();
}

function Logout()
{
    structDelete(client, "auth");
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是,因为客户端变量在会话结束时没有被清除,所以我们必须在OnSessionEnd处理程序中手动清除它.

这是处理ColdFusion中单点登录的最佳方式吗?如果是这样,使用客户端变量有什么缺点,或者需要注意缺陷吗?

更新:我只是测试客户端变量法,它看起来像只hitcount,timecreated,lastvisit,和urltoken应用程序之间共享,所以我又回到了起点1.

Dan*_*ort 2

将此作为给出新信息的答案发布。

警告


确保所有应用程序都具有 a) 持久变量的唯一应用程序范围名称,或 b) 出于相同目的的所有应用程序范围变量都具有相同的名称。


好吧,排除这一点,如果您的所有应用程序都位于子文件夹中的单个域中,则更改相同的属性this.name,并且所有应用程序将共享相同的作用域变量。这将确保如果您在一个应用程序中使用,则同一变量将可供该域下具有相同名称的所有应用程序使用。namecfapplicationsessionapplicationsession.loggedinsession.loggedin

您只需仔细测试,以确保您最终不会Application.LoginService在 Portal 中用于您的LoginService.cfc,而Application.LoginService在 Atlas 中用于不同的LoginService.cfc或完全不同的目的。