iis - iis ColdFusion 8到 ColdFusion 10迁移: CFloginUser未按预期工作

  显示原文与译文双语对照的内容

从CF8升级到CF10后,移动所有文件和数据库并跳过所有配置环。

以下是环境:

旧服务器: ColdFusion企业 8,0,1,195765

操作系统:Windows Vista*

操作系统版本:6.0

更新级别:。hf801-00007.jar

IIS版本:7

( *not确定"vista"是从哪里来的? 系统信息显示"。Windows Server 2008数据中心没有 Hyper-V")

新服务器: ColdFusion企业 10,0,11,285437

Tomcat版本:7.0.23.0

操作系统:Windows Server 2008 R2

操作系统版本:6.1

更新级别:。chf10000011.jar

Adobe驱动程序版本:4.1 ( 构建 0001 )

IIS版本:7.5

在老网站登录后,我将使用 cfloginuser插件登录,并将我的用户名输出到屏幕上,并且所有基于角色的规则都可以正常工作。

在新服务器上,输出 GetAuthUser() 打印为空。

在旧站点上,cfdump var="#SESSION#" 包括:


cfauthorization_kllcms dXNlcm5hbWU6cGFzc3dvcmQ6YXBwX25hbWU= 



在新站点上,会话 CFDUMP 根本不显示 cfauthorization_kllcms 值。 所有其他会话值都存在于两个实例中。

它们的基本代码和数据库结构完全相同,没有任何基于角色的规则工作,因为它们都依赖于和 IsUserInRole ("x") 条件的验证。

我知道初始登录过程本身正在运行,因为它正确地设置了用户信息的会话变量。 但是,传统的cflogin数据在后续调用中都不可用。

任何可能改变的想法?

我在老服务器上设置了 2个测试应用程序,其中一个在旧服务器上,一个在新服务器上,一个在新服务器上。

旧服务器:http://cfloginold.cimhost.com/index.cfm

新服务器:http://cflogin.cimhost.com/index.cfm

使用"测试"和"demo982013"作为用户和密码。

?logout=true 附加到要注销和测试的URL 。 这两个应用程序具有完全相同的代码,相同的数据库。 我正在将会话和表单值转储到屏幕,以及 GetAuthUser() 值。

身份验证方法与文档中的文档完全相同,我可以在这里共享所有相关代码。

请注意,在"新建"服务器中,每次访问页时,表单都会加载,无论你是否登录或者未登录。 这是 cflogin 会话没有保留或者识别的事实范例,因这里每个访问( 虽然不是在初始表单完成,但这表明cflogin至少处理初始登录,我认为) 都会显示登录表单。

我已经向这个系统深入 drilling,我能够让cfloginuser激发两种方式,只是不作为基于标准的Adobe文档的用户安全模型模型的一部分。

我创建了一个独立页面,并将以下代码放入其中:


<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,并且可以创建用户会话。

我的Application.cfc 文件可能与我的文件有关,所以我再次绕过了 cflogin gate,并将硬编码的代码Fragment直接放在了我的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 值的编码但是它还是失败了。 我对下一步该怎么办 am 。 我所需要的是 cfloginuser 功能,而不是在我需要它工作的地方。

更新3:

为了证明它不是我的代码,我创建了 2个测试站点,一个在旧服务器上,一个在新服务器上:

新建服务器( CF10 ) = http://cf10loginadobe.cimhost.com/securitytest.cfm

旧服务器( CF8 ) = http://cf8loginadobe.cimhost.com/securitytest.cfm

我从基于应用程序的安全示例中精确地复制了 3的文件。 首先,我创建一个数据库表,其中包含它的架构和值。 我添加了 CFDUMP 输出来显示正在创建的会话。

使用"bob"的用户和"秘密"密码进行测试。 即使使用了adobe代码,测试也在CF10上失败。

我不确定接下来该做什么。 重写应用程序不是使用 cfloginuser的选项,因为我们在数百个模板中迁移了一个上的应用程序,这些应用程序正在迁移到 CF10.

这是有可以能的,IIS7.5 如何处理adsi请求,但似乎不能在查询结果之外成功地实例化 cfloginuser

时间:

基于应用程序的用户安全问题被破坏

我已经部署了两个测试站点,使用基于用户安全性,的示例代码,从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 不显示在CF10中,在中是 cfauthorization_orders 值,在CF8中存在值。

在CF8中,登录后对相同URL的访问正确保留登录用户状态,而不显示登录表单。 在CF10中,实际上没有为用户创建任何会话,因这里再次访问同一个URL提示。

我已经进行了深入的测试,包括绕过 cflogin 逻辑并强制 cfloginuser 在CF10中成功创建一个已经验证的用户。

对于我来说,在创建和立即杀死用户会话的Application.cfc 中,处理 OnRequestStart 函数的CF10似乎有些关系。

解决方案:在代码中创建 cfloginuser 会话实例化,在随后的OnRequest 函数中创建会话实例化:


<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,我将利用该请求的结果,检查它是否有效,然后实例化已经验证的会话。 用户需要点击一个新页面来显示出现的选项。 在请求其他页加载之前,不满足 GetAuthUser() 测试。

在 Application.cfc 中大量的测试测试没有发现这种方法的任何替代。

...