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不会打扰.
这对我来说是一个问题,原因如下:
favicon.ico步骤274.runAllManagedModulesForAllRequests,因此对所有内容的图标请求都通过表单身份验证运行.<link>指定并指定其位置,Chrome和Firefox会尝试从您的网络根目录中获取一个.表单身份验证(和我的web.config)锁定了我的root.从我的root用户提供的唯一文件是我的loginUrl页面.每次发出请求时favicon.ico,Forms Authentication都会禁止它并将请求重定向到我的loginUrl页面,从而导致我的loginUrl页面被执行两次并搞砸了我的会话值.以下Fiddler截图显示了证据.
虽然Firefox似乎最初要求它两次,出于某种原因,但随后放弃后续请求:
所以,解决方案:
favicon.ico文件并将其放在您的Web根目录中.允许通过<location>root中的元素匿名访问它web.config.
<location path="favicon.ico">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)或者(可能是首选方法,因为您可以指定名称和位置):
favicon.ico文件并将其放在公共子文件夹中,例如/img.<link>在你的loginUrl页面中正确地.
<link rel="icon" href="/img/favicon.ico">
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
461 次 |
| 最近记录: |