表单身份验证 - 为每个请求执行loginUrl页面(仅限Chrome)

Bon*_*ond 8 iis session forms-authentication google-chrome asp-classic

我想我已经尽可能地减少了这一点.它只在使用表单身份验证时才会发生,并且似乎只在IE中工作.到目前为止,我发现Chrome和Firefox都会导致这个问题.我有一个非常简单的ASP页面,它在每个页面加载时递增计数器(存储在会话变量中).该页面已命名test.asp并显示在我的Web根目录中.以下是内容:

<%
    ' Write the last value (obviously blank the first time)...
    Response.Write "Last Num: " & Session("Num") &  "<br>"

    ' Increment the counter...
    Session("Num") = Session("Num") + 1

    ' Show the number we just saved...
    Response.Write "This Num: " & Session("Num") & "<br>"

    ' Throw the session ID out there, too, to make sure it's consistent...
    Response.Write "Session ID: " & Session.SessionID
%>

<form method="post" action="test.asp">
    <input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)

web.config仍然尽可能地剥离了我,同时还在重现这个问题.这是它的内容:

<configuration>
    <system.webServer>  
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <authorization>         
            <deny users="?" />          
            <allow users="*" />         
        </authorization>
        <authentication mode="Forms">
            <forms loginUrl="test.asp" />
        </authentication>
    </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这里非常基本的东西.我已设置test.asp为"登录"页面并启用runAllManagedModulesForAllRequests.事情按预期工作.test.asp正如您所料,所有请求都被重定向到.并test.asp加载罚款,但它接下来会发生什么?

以下是最初加载和提交后页面在IE(v11),Chrome(v44)和Firefox(v39)中的显示方式:

Internet Explorer 11:

在此输入图像描述 在此输入图像描述

谷歌Chrome 44:

在此输入图像描述 在此输入图像描述

Mozilla Firefox 39:

在此输入图像描述 在此输入图像描述

当我点击时[Submit],我显然希望该Last Num值等于前一个值This Num.但这只发生在IE中.在Chrome中,它似乎正在做一个额外的增量.在Firefox中,它似乎做了两个!为了让事情更加混乱,在初次提交之后,Firefox每次都适当增加1.但是,Chrome会在每次提交时继续增加一倍.

这些是默认的浏览器安装.没有添加扩展或特殊配置.所有三种浏览器都启用了Cookie(默认设置).我可以ASPSESSIONID使用每个浏览器的开发人员工具查看cookie.而且,正如您在屏幕截图中看到的那样,它Session ID是在页面加载时创建的,并在整个会话期间保持一致.

如果我继续提交,结果是一样的.IE继续正常工作.其他浏览器继续增加两倍或三倍.

以前有人见过这个问题吗?或者看看我在哪里出错?我也尝试过cookieless="UseCookies"在这<forms>部分中指定web.config.

编辑1 - 在其他地方测试:

到目前为止,我所有的测试都在我的本地PC上:带有IIS 7.5的Windows 7 64位.今天,我连接到我的最终测试服务器 - 一个Windows Server 2008 R2盒子,还有IIS 7.5 - 我在测试页面上获得了相同的结果.

编辑2 - loginUrl相关?

使用新页面,test2.asp具有相同的内容(并通过<location>我的元素显式匿名访问web.config)工作正常.所以它似乎有loginUrl关系?也许每个页面请求,它loginUrl在幕后调用页面?但同样,与Chrome/Firefox有一些联系......

编辑3 - 更多证明:

我决定记录This Num每次执行页面时的值.这就是我所看到的:

IE浏览器:

8/4/2015 11:52:07 AM, Num=[1]    Initial page load. One execution.
-----------------------------
8/4/2015 11:52:11 AM, Num=[2]    All future submissions run once.
8/4/2015 11:52:16 AM, Num=[3]
8/4/2015 11:52:20 AM, Num=[4]
Run Code Online (Sandbox Code Playgroud)

铬:

8/4/2015 11:34:58 AM, Num=[1]    I get 2 executions on initial page load.     
8/4/2015 11:35:00 AM, Num=[2]    First execution (Num=1) appears in browser.
-----------------------------
8/4/2015 11:35:29 AM, Num=[3]    Every submit causes page to run twice.
8/4/2015 11:35:29 AM, Num=[4]
-----------------------------
8/4/2015 11:35:49 AM, Num=[5]
8/4/2015 11:35:49 AM, Num=[6]
Run Code Online (Sandbox Code Playgroud)

火狐:

8/4/2015 11:36:25 AM, Num=[1]    I get 3 executions on initial page load.
8/4/2015 11:36:25 AM, Num=[2]    The first execution (Num=1) is the page
8/4/2015 11:36:25 AM, Num=[3]    I see in the browser.
-----------------------------
8/4/2015 11:36:34 AM, Num=[4]    All future submissions run once.
8/4/2015 11:36:43 AM, Num=[5]
8/4/2015 11:36:48 AM, Num=[6]
8/4/2015 11:36:53 AM, Num=[7]
Run Code Online (Sandbox Code Playgroud)

编辑4 - 在每个请求上调用loginUrl页面:

似乎任何类型的页面请求都会导致test.asp在幕后执行,这会增加会话变量.这必须是因为它是loginUrlForms Auth 标识的页面.结合我在编辑2和编辑3下进行的测试,我授权匿名访问新的测试页面(test2.asp),它不会做任何特殊的事情 - 只需加载一个静态页面.这里是:

<html><body>I'm test2.asp</body></html>
Run Code Online (Sandbox Code Playgroud)

然后我监视test.asp运行时附加的日志文件.每次我请求时test2,我都会在日志中获得一个新条目.因此,每次我发出页面请求时,test.asp都会在后台运行(并增加会话变量).以下是日志在向test2页面发出三个请求后的状态:

8/4/2015 12:20:57 PM, Num=[3]
8/4/2015 12:21:07 PM, Num=[4]
8/4/2015 12:21:14 PM, Num=[5]
Run Code Online (Sandbox Code Playgroud)

test2.asp对会话变量(也不记录)没有任何作用,但有证据.因此,出于某种原因,在Chrome上,它会loginUrl针对每个请求运行页面.我想我可以考虑将其证明.现在我只需要一个解决方案!

Bon*_*ond 10

在Fiddler的帮助下,我能够解决这个问题.

Chrome和Firefox似乎都会为您提出额外请求favicon.ico,无论您是否已指定在HTLM页面中使用它.另一方面,Internet Explorer不会打扰.

这对我来说是一个问题,原因如下:

  1. 我没有.我刚刚开始我的网站并创建了一个favicon.ico步骤274.
  2. 我正在使用runAllManagedModulesForAllRequests,因此对所有内容的图标请求都通过表单身份验证运行.
  3. 如果您不<link>指定并指定其位置,Chrome和Firefox会尝试从您的网络根目录中获取一个.表单身份验证(和我的web.config)锁定了我的root.从我的root用户提供的唯一文件是我的loginUrl页面.

每次发出请求时favicon.ico,Forms Authentication都会禁止它并将请求重定向到我的loginUrl页面,从而导致我的loginUrl页面被执行两次并搞砸了我的会话值.以下Fiddler截图显示了证据.

Chrome似乎在每个页面请求上请求图标: 在此输入图像描述

虽然Firefox似乎最初要求它两次,出于某种原因,但随后放弃后续请求:

在此输入图像描述

所以,解决方案:

  1. 创建一个favicon.ico文件并将其放在您的Web根目录中.
  2. 允许通过<location>root中的元素匿名访问它web.config.

    <location path="favicon.ico">
        <system.web>
            <authorization>
                <allow users="?" />
            </authorization> 
        </system.web>
    </location>
    
    Run Code Online (Sandbox Code Playgroud)

或者(可能是首选方法,因为您可以指定名称和位置):

  1. 创建一个favicon.ico文件并将其放在公共子文件夹中,例如/img.
  2. <link>在你的loginUrl页面中正确地.

    <link rel="icon" href="/img/favicon.ico">
    
    Run Code Online (Sandbox Code Playgroud)