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

下一篇: Push Notifications through BES/BIS , BlackBerry