Iis ColdFusion 8到ColdFusion 10迁移:cfLogin用户未按预期工作
在从CF8升级到CF10、移动所有文件和数据库并跳过所有配置环之后,新版本的站点已启动并运行,但身份验证/登录不起作用 以下是环境: 旧服务器:ColdFusion Enterprise 8,0,1195765 操作系统:Windows Vista* 操作系统版本:6.0 更新级别:。。。。hf801-00007.jar IIS版本:7 (*不确定“Vista”来自何处?系统信息显示“不带Hyper-V的Windows Server 2008数据中心”) 新服务器:ColdFusion Enterprise 10,0,11285437 Tomcat版本:7.0.23.0 操作系统:Windows Server 2008 R2 操作系统版本:6.1 更新级别:。。。。CHF100011.jar Adobe驱动程序版本:4.1(内部版本0001) IIS版本:7.5 我有一个非常标准的ColdFusion登录系统,在Application.cfc中使用。登录到旧站点后,输出Iis ColdFusion 8到ColdFusion 10迁移:cfLogin用户未按预期工作,iis,coldfusion,coldfusion-8,coldfusion-10,cflogin,Iis,Coldfusion,Coldfusion 8,Coldfusion 10,Cflogin,在从CF8升级到CF10、移动所有文件和数据库并跳过所有配置环之后,新版本的站点已启动并运行,但身份验证/登录不起作用 以下是环境: 旧服务器:ColdFusion Enterprise 8,0,1195765 操作系统:Windows Vista* 操作系统版本:6.0 更新级别:。。。。hf801-00007.jar IIS版本:7 (*不确定“Vista”来自何处?系统信息显示“不带Hyper-V的Windows Server 2008数据中心”) 新服务器:ColdFusion Ente
#GetAuthUser()#
将我的用户名打印到屏幕上,我所有基于角色的规则都有效
在新服务器上,输出GetAuthUser()打印为空
在旧站点上,cfdump var=“#SESSION#”
包括:
cfauthorization_kllcms dXNlcm5hbWU6cGFzc3dvcmQ6YXBwX25hbWU=
在新站点上,会话的CFDUMP
根本不显示cfauthorization\u kllcms
值。两个实例中都存在所有其他会话值
它与代码库、数据库结构等完全相同。当然,我的基于角色的规则都不起作用,因为它们都依赖于getAuthUser()和IsUserInRole(“x”)条件的验证
我知道初始登录过程本身正在工作,因为它使用用户信息正确地设置了会话变量,并且这些变量在后续请求中可用。但是传统的cflogin数据在随后的调用中都不可用
你知道什么会改变吗
更新:根据Adam的建议(如下),我设置了两个测试应用程序,一个在旧服务器上,一个在新服务器上
旧服务器:
新服务器:
使用“测试”和“demo982013”作为用户和密码
将?logout=true
附加到URL以注销并重新测试。这两个应用程序有完全相同的代码,相同的数据库。我正在将会话和表单值以及GetAuthUser()
value一起转储到屏幕上
身份验证方法与中所述的基本相同,如有必要,我可以在这里共享所有相关代码
请注意,在“新”服务器中,无论您是否登录,每次访问页面时都会加载表单。这是cflogin
会话未被保留或识别的示例,因此每次访问都会显示登录表单(虽然不是在初始表单完成时,这表明cflogin至少在初始登录时工作)
更新2:
我一直在深入研究这一点,我能够让cfloginuser以几种方式启动,只是不作为标准的一部分
选项1:我创建了一个独立页面,并在其中放置了以下代码:
<cflogin><cfloginuser name="directtest" Password = "2519D6025B5191F754D01BE163972628" roles="1"></cflogin>
我知道查询成功,因为我正在设置一条警告消息,告诉我loginquery.userroles
值不是空的,这是处理cflogiuser
的条件
我知道代码在哪里失败了,只是不知道为什么。我尝试过对cfloginuser
值进行硬编码,但仍然失败。我不知道下一步该怎么办。cfloginuser
功能可以工作,只是不在我需要它工作的地方(在loginQuery.userroles
条件中)
更新3:
为了向自己证明这不是我的代码,我又创建了两个测试站点,一个在旧服务器上,一个在新服务器上:
新服务器(CF10)=
旧服务器(CF8)=
我复制了一个数据库表,其中包含它们的模式和值。我添加了我的cfdump
输出以显示正在创建的会话
使用“Bob”用户和“secret”密码进行测试。即使使用Adobe自己的代码,测试也会在CF10上失败
我不知道下一步该怎么办。重写应用程序以不使用cfloginuser
不是一个选项,因为我们有十几个应用程序正在迁移到使用此身份验证模型的CF10,跨越数百个模板
IIS7.5处理ColdFusion请求的方式可能有点奇怪,但考虑到能够在查询结果条件之外成功实例化
cfLogiUser
。ColdFusion 10基于应用程序的用户安全性被破坏
我已经部署了两个测试站点,使用了从Adobe网站复制的全部内容。一个测试点位于ColdFusion 8,一个位于ColdFusion 10。两个站点上的代码和数据库相同。我添加了cfdump
输出,以在设置会话变量和登录状态时监视它们
测试站点ColdFusion 8:
测试站点ColdFusion 10:
使用“Bob”用户和“secret”密码登录表明CF10中的失败。最初显示登录成功,但请注意会话的cfdump
在CF10中未显示cfauthorization\u orders
值,而在CF8中,该值存在
在CF8中,登录后对同一URL的后续访问正确保留登录用户状态,并且不显示登录表单。在CF10中,实际上没有为用户创建会话,因此对同一URL的后续访问会提示再次登录
我已经对此进行了彻底的测试,包括绕过cflogin
逻辑和强制cfloginuser
,这成功地在CF10中创建了一个经过身份验证的用户demons
<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>
<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>