从 CF8 升级到 CF10,移动所有文件和数据库并跳过所有配置箍后,新版本的站点启动并运行,但身份验证/登录不起作用。
以下是环境:
旧服务器: ColdFusion Enterprise 8,0,1,195765
操作系统:Windows Vista*
操作系统版本:6.0
更新级别:.... hf801-00007.jar
IIS 版本:7
(*不确定“Vista”来自哪里?系统信息显示“Windows Server 2008 Datacenter without Hyper-V”)
新服务器: ColdFusion Enterprise 10,0,11,285437
Tomcat 版本:7.0.23.0
操作系统:Windows Server 2008 R2
操作系统版本:6.1
更新级别:....chf10000011.jar
Adobe 驱动程序版本:4.1(内部版本 0001)
IIS 版本:7.5
我有一个非常标准的 ColdFusion 登录系统,在 Application.cfc 中使用cfloginuser。在我登录旧站点后,输出#GetAuthUser()#
会将我的用户名打印到屏幕上,并且我所有基于角色的规则都有效。
在新服务器上,输出 GetAuthUser() 打印为空。
在旧网站上,cfdump var="#SESSION#"
包括:
cfauthorization_kllcms dXNlcm5hbWU6cGFzc3dvcmQ6YXBwX25hbWU=
在新站点上,CFDUMP
of session 根本不显示任何cfauthorization_kllcms
值。所有其他会话值都存在于两个实例中。
它是完全相同的代码库、数据库结构等。当然,我的基于角色的规则都不起作用,因为它们都依赖于对 getAuthUser() 和 IsUserInRole("x") 条件的验证。
我知道初始登录过程本身正在运行,因为它使用用户信息正确设置会话变量,并且它们可用于后续请求。但是在后续调用中没有任何传统的 cflogin 数据可用。
有什么想法可能会改变吗?
更新:根据亚当的建议(如下),我设置了 2 个测试应用程序,一个在旧服务器上,一个在新服务器上。
旧服务器: http ://cfloginold.cimhost.com/index.cfm
新服务器: http ://cflogin.cimhost.com/index.cfm
使用“test”和“demo982013”作为用户名和密码。
附加?logout=true
到 URL 以注销并重新测试。这两个应用程序具有完全相同的代码、相同的数据库。我将会话和表单值连同GetAuthUser()
值一起转储到屏幕上。
身份验证方法与Adobe 文档中概述的几乎完全相同,如有必要,我可以在此处分享所有相关代码。
请注意,在“新”服务器中,每次访问页面时都会加载表单,无论您是否已登录。这是cflogin
会话没有被保留或识别的例子,因此每次访问都会显示登录表单(尽管不是在初始表单完成时,这表明 cflogin 至少在初始登录上工作,我认为)。
更新 2: 我一直在深入研究这一点,我能够让 cfloginuser 以几种方式触发,只是不是作为标准Adobe 记录的基于应用程序的用户安全模型的一部分。
选项 1:我创建了一个独立页面,并在其中放置了以下代码:
<cflogin><cfloginuser name="directtest" Password = "2519D6025B5191F754D01BE163972628" roles="1"></cflogin>
然后我指示 Application.cfc 允许它通过cflogin
大门。您可以通过将浏览器指向以下网址来查看结果:http ://cflogin.cimhost.com/directlogin.cfm?bypass=true
瞧。'cfauthorization_cicmstest' 值已设置,用户已登录。后续调用GetAuthUser()
成功。所以我现在知道 CF10 和应用程序确实允许 cfloginuser,并且可以创建用户会话。
选项 2:然后我决定这可能与我的 Application.cfc 文件有关,所以我再次绕过cflogin
门,将硬编码cfloginuser
片段直接放在我的 Application.cfconRequestStart
函数中。登出并访问:http ://cflogin.cimhost.com/index.cfm?bypass=true&noquery=true
同样,cfauthorization_cicmstest
值已成功设置,并且用户已登录。
cfloginuser
但是,如果在 Application.cfc中的实际cflogin
进程中触发指令,登录仍然会失败。这是该代码的样子:
<cfquery name="loginQuery" dataSource="mydatasource">
SELECT id,username, userroles
FROM myusertable
WHERE
username = '#cflogin.name#'
AND userpass = '#HASH(cflogin.password)#'
</cfquery>
<cfif loginQuery.userroles NEQ "">
<cfloginuser name="#cflogin.name#" Password="#cflogin.password#" roles="#loginQuery.userroles#">
<cfset MyMessage = "#MyMessage#<br />The Login Query fired and returned expected - loginQuery.userroles NEQ ''">
<cfelse>
<CFSET MyMessage = "Your login information is not valid. <a href='index.cfm?logout=1'>If your session timed out, click here!</a>">
<cfinclude template="loginform.cfm">
<cfabort>
</cfif>
我知道查询是成功的,因为我正在设置一条警报消息,告诉我该loginquery.userroles
值不为空,这是处理的条件cfloginuser
。
我知道代码现在哪里失败了,只是不知道为什么。我已经尝试对该值进行硬编码,cfloginuser
但仍然失败。我不知道下一步该尝试什么。该cfloginuser
功能有效,只是不在loginQuery.userroles
我需要它工作的一个地方(在条件内)。
更新 3:
为了向自己证明这不是我的代码,我又创建了 2 个测试站点,一个在旧服务器上,一个在新服务器上:
新服务器 (CF10) = http://cf10loginadobe.cimhost.com/securitytest.cfm
旧服务器 (CF8) = http://cf8loginadobe.cimhost.com/securitytest.cfm
我从他们的基于应用程序的安全示例中准确复制了Adobe 的 3 个文件。我用它们的模式和值创建了一个数据库表。我添加了cfdump
输出以显示正在创建的会话。
使用“Bob”用户和“secret”密码进行测试。即使使用 Adobe 自己的代码,CF10 上的测试也会失败。
我不确定下一步该怎么做。将应用程序重写为不使用cfloginuser
不是一种选择,因为我们有十几个应用程序正在迁移到使用此身份验证模型的 CF10,它们跨越数百个模板。
cfloginuser
IIS7.5 处理 ColdFusion 请求的方式可能有些奇怪,但考虑到在条件查询结果之外成功实例化的能力,这似乎不太可能。