Session 会话超时后ColdFusion用户登录失败

Session 会话超时后ColdFusion用户登录失败,session,login,coldfusion,coldfusion-11,Session,Login,Coldfusion,Coldfusion 11,我们最近搬到了cf11进行一个项目,遇到了一个不寻常的问题: 当用户让他们的会话超时,并尝试重新登录时,需要两次尝试才能成功登录 当用户手动注销时,他们登录没有问题 这个问题在CF8中没有发生。我已经检查了用户范围,看不出有什么不同。我尝试在登录之前添加注销代码,希望可以使状态保持不变。两者都不起作用。这是一个已知的问题吗?你有什么建议我可以试试吗 编辑: 我在项目的根目录中有Application.cfc和result.cfm。 我有一个未登录页面的登录/文件夹。包含处理身份验证的signin

我们最近搬到了cf11进行一个项目,遇到了一个不寻常的问题:

当用户让他们的会话超时,并尝试重新登录时,需要两次尝试才能成功登录

当用户手动注销时,他们登录没有问题

这个问题在CF8中没有发生。我已经检查了用户范围,看不出有什么不同。我尝试在登录之前添加注销代码,希望可以使状态保持不变。两者都不起作用。这是一个已知的问题吗?你有什么建议我可以试试吗

编辑:

我在项目的根目录中有Application.cfc和result.cfm。 我有一个未登录页面的登录/文件夹。包含处理身份验证的signin.cfm和onsignin.cfm的。 运行代码时,请等待会话超时,然后再次使用相同的用户名登录

signin/signin.cfm

<form action="onsignin.cfm" method="POST" >
    User name: <input name="login" type="text" />
    <input type="submit" value="Login" name="btnSubmit" >
</form>
<cffunction name="authenticate" access="public" returntype="void">
    <cfargument name="login" />
    <cflogin idletimeout="3600">
        <cfloginuser name="#arguments.login#" password="1234AbCd" roles="admin,developer,login_session,login_signoff" />
    </cflogin>
    <cfreturn />
</cffunction>

<cfscript>
    authenticate(trim(Login));
    writeOutput("At /signin/onsignin.cfm<br/>");
    writeOutput("IsUserLoggedIn: #IsUserLoggedIn()#<br /><hr/>");
</cfscript>

<cflocation url="../result.cfm" addToken="no" /><!--- before we get to result.cfm onRequestStart() in Application.cfc is triggered. --->

用户名:
signin/onsignin.cfm

<form action="onsignin.cfm" method="POST" >
    User name: <input name="login" type="text" />
    <input type="submit" value="Login" name="btnSubmit" >
</form>
<cffunction name="authenticate" access="public" returntype="void">
    <cfargument name="login" />
    <cflogin idletimeout="3600">
        <cfloginuser name="#arguments.login#" password="1234AbCd" roles="admin,developer,login_session,login_signoff" />
    </cflogin>
    <cfreturn />
</cffunction>

<cfscript>
    authenticate(trim(Login));
    writeOutput("At /signin/onsignin.cfm<br/>");
    writeOutput("IsUserLoggedIn: #IsUserLoggedIn()#<br /><hr/>");
</cfscript>

<cflocation url="../result.cfm" addToken="no" /><!--- before we get to result.cfm onRequestStart() in Application.cfc is triggered. --->

验证(trim(登录));
写输出(“At/signin/onsignin.cfm
”; 写输出(“IsUserLoggedIn:#IsUserLoggedIn()#

”;
Application.cfc

<cfcomponent>
    <cfset THIS.Name = "LoginTest" />
    <cfset THIS.SessionManagement = true />
    <cfset THIS.ClientManagement = false />
    <cfset THIS.LoginStorage = "session" />
    <cfset THIS.setClientCookies = false />
    <cfset This.sessiontimeout= createTimeSpan(0,0,0,20)/><!--- 20second timeout to show the session problem --->

    <cffunction name="outputCurrentLoginState" access="private">
        <cfargument name="currentFunction" type="string" required="true"/>
        <cfargument name="TargetPage" type="string" required="true"/>
        <cfscript>
            writeOutput("In function: #arguments.currentFunction# state is <br />");
            writeOutput("TargetPage: #arguments.TargetPage# <br />");
            writeOutput("GetAuthUser: #GetAuthUser()#<br />");
            writeOutput("GetUserRoles: #GetUserRoles()#<br />");
            writedump(session);
            writedump(cookie);
            writeOutput("IsUserLoggedIn: #IsUserLoggedIn()#<br /><hr />");
            /*use writeLog() to view to Console */
        </cfscript>
    </cffunction>

    <cffunction name="OnRequestStart" access="public" returntype="boolean">
        <cfargument name="TargetPage" type="string" required="true"/>
        <cfset outputCurrentLoginState("OnRequestStart",arguments.TargetPage)/>
        <cfif not IsDefined("Cookie.CFID")>
            <CFLOCK SCOPE="SESSION" TYPE="exclusive" TIMEOUT="5">
                <cfcookie name="CFID" value="#SESSION.CFID#" secure="false" httpOnly="true" />
                <cfcookie name="CFTOKEN" value="#SESSION.CFTOKEN#" secure="false" httpOnly="true" />
            </CFLOCK>
        </cfif>
        <cfreturn true />
    </cffunction>

    <cffunction name="OnRequest" access="public">
        <cfargument name="TargetPage" type="string" required="true"/>
        <cfset outputCurrentLoginState("OnRequest",arguments.TargetPage)/>
        <cfif findNoCase("signin/", arguments.TargetPage)>
            <cflogout/>
        </cfif>
        <cfinclude template="#ARGUMENTS.TargetPage#" />
    </cffunction>
</cfcomponent>

writeOutput(“函数中:#参数。当前函数#状态为
”); writeOutput(“TargetPage:#arguments.TargetPage#
”); writeOutput(“GetAuthUser:#GetAuthUser()#
”); writeOutput(“GetUserRoles:#GetUserRoles()#
”); 书面会议(会议); writedump(cookie); 写输出(“IsUserLoggedIn:#IsUserLoggedIn()#

”; /*使用writeLog()查看控制台*/
result.cfm

<cfscript>
    writeOutput("GetAuthUser: #GetAuthUser()#<br />");
    writeOutput("GetUserRoles: #GetUserRoles()#<br />");
    writeOutput("--- IsUserLoggedIn: #IsUserLoggedIn()#<br />");
    writeOutput("At /result.cfm<hr/>");
</cfscript>

writeOutput(“GetAuthUser:#GetAuthUser()#
”); writeOutput(“GetUserRoles:#GetUserRoles()#
”); writeOutput(“--IsUserLoggedIn:#IsUserLoggedIn()#
”; 写输出(“At/result.cfm
”;

更新:现在我有了上面的测试代码,但在cf11中失败了,我在cf8服务器上试用了它,在cf8中它可以正常工作。会话超时时,用户在创建新会话时没有任何问题。只有在cf11中出现故障时才会显示。

更新

关于这个问题,Adobe已经打开了一个bug-。我建议您添加您的经验并对该bug进行投票。它当前的状态为“ToTrack”,原因是“PRNeedInfo”。我也投了赞成票,并添加了对这个问题的参考以获取更多信息


从评论中提升

我认为问题在于您已将
标记的
idletimeout
属性设置为一个比会话超时值(20秒)长的值(3600秒)。这不是一个有效的办法。我知道您已将会话超时设置为20秒,以便于测试。但是,当您将
登录存储
设置为
会话
时,将
空闲超时时间设置为比会话超时时间更长是没有意义的。
标记试图保持用户会话处于活动状态,但会话本身在其控制范围之外被破坏。在我看来,这是自找麻烦。保持idletimeout设置小于或至少等于会话超时设置

我怀疑您看到的ColdFusion版本之间的差异可能与添加到ColdFusion 11中的
标记的新属性有关。
allowconcurrent
属性()。默认情况下,该设置设置为
true
,这意味着应该允许并发登录会话。尝试将该属性设置为false,如,
。我相信这将使
标记像在ColdFusion 8中一样工作

您在评论中提到,将
allowconcurrent
设置为
false
不是一个可接受的解决方案。为什么?这就是ColdFusion 8的工作原理。我觉得你看到的行为是“按设计工作”。但是,如果您觉得这是一个bug,那么


另外,我还注意到您正在将
ClientManagement
setClientCookies
都设置为
false
。然而,在您的
OnRequestStart
方法中,您正在设置这些cookie。为什么?会话管理不需要它们。ColdFusion服务器将为您处理此问题。

更新

关于这个问题,Adobe已经打开了一个bug-。我建议您添加您的经验并对该bug进行投票。它当前的状态为“ToTrack”,原因是“PRNeedInfo”。我也投了赞成票,并添加了对这个问题的参考以获取更多信息


从评论中提升

我认为问题在于您已将
标记的
idletimeout
属性设置为一个比会话超时值(20秒)长的值(3600秒)。这不是一个有效的办法。我知道您已将会话超时设置为20秒,以便于测试。但是,当您将
登录存储
设置为
会话
时,将
空闲超时时间设置为比会话超时时间更长是没有意义的。
标记试图保持用户会话处于活动状态,但会话本身在其控制范围之外被破坏。在我看来,这是自找麻烦。保持idletimeout设置小于或至少等于会话超时设置

我怀疑您看到的ColdFusion版本之间的差异可能与添加到ColdFusion 11中的
标记的新属性有关。
<cflogin ..>
<cflogin ..>