ColdFusion 8迁移到ColdFusion 10:CFloginUser未按预期工作
从CF8升级到CF10后,移动所有文件和数据库并跳过所有配置环节,新版本的站点启动并运行,但认证/登录不起作用。
这里是环境:
旧服务器: ColdFusion Enterprise 8,0,1,195765
操作系统:Windows Vista *
操作系统版本:6.0
更新等级:.... hf801-00007.jar
IIS版本:7
(*不确定“Vista”来自何处?系统信息显示“没有Hyper-V的Windows Server 2008 Datacenter”)
新服务器: ColdFusion Enterprise 10,0,11,285437
Tomcat版本:7.0.23.0
操作系统:Windows Server 2008 R2
操作系统版本:6.1
更新级别:.... chf10000011.jar
Adobe Driver版本:4.1(Build 0001)
IIS版本:7.5
我有一个非常标准的ColdFusion登录系统,在Application.cfc中使用cfloginuser。 在我登录旧网站后,输出#GetAuthUser()#
我的用户名输出到屏幕上,并且所有基于角色的规则都能正常工作。
在新服务器上,输出GetAuthUser()将打印为空。
在旧网站上, cfdump var="#SESSION#"
包括:
cfauthorization_kllcms dXNlcm5hbWU6cGFzc3dvcmQ6YXBwX25hbWU=
在新的网站, CFDUMP
会话不显示cfauthorization_kllcms
在所有的价值。 所有其他会话值都存在于两个实例中。
它是完全相同的代码库,数据库结构等等。自然,我的基于角色的规则都不起作用,因为它们都依赖于getAuthUser()和IsUserInRole(“x”)条件的验证。
我知道初始登录过程本身正在工作,因为它可以正确设置包含用户信息的会话变量,并且可以在随后的请求中使用它们。 但是在随后的调用中没有传统的cflogin数据可用。
任何想法可能会改变?
更新:根据Adam的建议(下图),我设置了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.cfc onRequestStart
函数中。 退出并访问: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:
为了向我自己证明这不是我的代码,我创建了另外两个测试站点,一个在旧服务器上,一个在新服务器上:
新服务器(CF10)= http://cf10loginadobe.cimhost.com/securitytest.cfm
旧服务器(CF8)= http://cf8loginadobe.cimhost.com/securitytest.cfm
我从他们基于应用程序的安全示例中正确复制了Adobe的3个文件。 我用他们的模式和值创建了一个数据库表。 我添加了我的cfdump
输出以显示正在创建的会话。
用“Bob”的用户和“secret”的密码进行测试。 即使使用Adobe自己的代码,测试也会在CF10上失败。
我不确定接下来要做什么。 将应用程序重写为不使用cfloginuser
不是一种选择,因为我们有十几个应用程序正在迁移到使用此身份验证模型的CF10,跨越数百个模板。
有可能关于IIS7.5如何处理ColdFusion请求cfloginuser
,但考虑到能够在查询结果条件之外成功实例化cfloginuser
,这似乎不太可能。
基于ColdFusion 10应用程序的用户安全性被破坏
我部署了两个测试站点,使用Adobe自己的示例代码实现基于应用程序的用户安全性,并从Adobe网站完整复制。 一个测试站点在ColdFusion 8中,一个是ColdFusion 10.两个站点上的代码和数据库是相同的。 我添加了cfdump
输出来监视会话变量和登录状态。
测试网站ColdFusion 8: http : //cf8loginadobe.cimhost.com/securitytest.cfm
测试网站ColdFusion 10: http : //cf10loginadobe.cimhost.com/securitytest.cfm
使用“Bob”用户和“秘密”密码登录证明CF10失败。 最初,它出现登录成功,但要注意的是, cfdump
会话不显示cfauthorization_orders
在CF10值,其中在CF8价值是存在的。
在CF8中,在登录后对相同URL进行的后续访问会正确保留登录的用户状态,并且不会显示登录表单。 在CF10中,实际上没有为用户创建会话,因此后续访问相同的URL会再次提示登录。
我已经彻底地进行了测试,包括绕过cflogin
逻辑并强制cfloginuser
,它在CF10中成功创建了一个已通过身份验证的用户,证明cfloginuser
受支持。
在我看来,有一些CF10处理Application.cfc中的OnRequestStart
函数,该函数创建并立即OnRequestStart
用户会话。
解决方法:我正在使用的不雅的解决方法涉及在Application.cfc的后续OnRequest
函数中重新创建cfloginuser
会话实例。 代码如下:
<cffunction name="onRequest">
<cfargument name = "targetPage" type="String" required=true/>
<cfinclude template=#Arguments.targetPage#>
<cfif IsDefined("loginQuery")>
<cfif loginQuery.userroles NEQ "">
<cflogin><cfloginuser name="#loginQuery.username#" Password = "#loginQuery.userpass#" roles="#loginQuery.userroles#"></cflogin>
</cfif>
</cfif>
</cffunction>
如果尝试在OnRequestStart
登录,我利用该请求的结果,检查它是否有效( loginQuery.userroles NEQ ""
),然后实例化已验证的会话。 有一个缺点是用户必须点击一个新页面才能显示登录选项。 在请求另一个页面加载之前, GetAuthUser()
测试不会被满足。
Application.cfc中的替代方案的大量测试没有揭示这种方法的替代方案。
链接地址: http://www.djcxy.com/p/60551.html上一篇: ColdFusion 8 to ColdFusion 10 Migration: CFloginUser Not Working As Expected