Dan*_* T. 7 authentication coldfusion session-variables single-sign-on coldfusion-9
我有多个CF应用程序在相同的域名下运行在同一台服务器上.其中之一,我们称之为Portal,旨在成为其他应用程序的单点登录,让我们称之为Atlas和P-Body.通常,您会在session范围中设置一些变量来处理登录信息:
function Login()
{
session.auth = structNew();
session.auth.isLoggedIn = true;
session.auth.id = GetCurrentUserId();
}
Run Code Online (Sandbox Code Playgroud)
但会话范围仅在一个应用程序中共享,而不是在整个服务器中共享.这意味着登录Portal的任何用户都将保持登录状态,但如果他们尝试导航到Atlas或P-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.
将此作为给出新信息的答案发布。
警告
确保所有应用程序都具有 a) 持久变量的唯一应用程序范围名称,或 b) 出于相同目的的所有应用程序范围变量都具有相同的名称。
好吧,排除这一点,如果您的所有应用程序都位于子文件夹中的单个域中,则更改相同的属性this.name,并且所有应用程序将共享相同的作用域变量。这将确保如果您在一个应用程序中使用,则同一变量将可供该域下具有相同名称的所有应用程序使用。namecfapplicationsessionapplicationsession.loggedinsession.loggedin
您只需仔细测试,以确保您最终不会Application.LoginService在 Portal 中用于您的LoginService.cfc,而Application.LoginService在 Atlas 中用于不同的LoginService.cfc或完全不同的目的。
| 归档时间: |
|
| 查看次数: |
2833 次 |
| 最近记录: |