Asp.net随机停止遵守表单身份验证白名单
本文关键字:白名单 身份验证 名单 表单 随机 net Asp | 更新日期: 2023-09-27 17:57:33
问题
上个月,我们将asp.net网站场从Server2008R2迁移到Server2012R2,并升级到asp.net 4.5。我们使用cookied表单身份验证来防止未经授权访问网站。
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
我们有一些资产和页面(例如:登录页面)在web.config:中被列入白名单
<location path="signin">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
在过去的几个月里,我们注意到IIS/Asp.net随机停止遵守白名单,并认为所有内容都需要进行身份验证。所有对该服务器上网站的请求都将被重定向到登录页面,然后会抛出500错误。无法检索任何白名单资产。
当IIS出错时,我们可以在事件查看器中看到2个错误。第一:
Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.
at System.Web.PipelineModuleStepContainer.GetNextEvent(RequestNotification notification, Boolean isPostEvent, Int32 eventIndex)
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
第二个并不总是出现:
Event code: 4005
Event message: Forms authentication failed for the request. Reason: The ticket supplied has expired.
iis过程将持续数小时,然后突然开始做这种奇怪的事情。一旦我们回收应用程序池,甚至只是修改web.config,网站就会重新开始工作。
我们尝试过的东西
老实说,我们被难住了。这在我们的旧服务器上没有发生,但从那时起,我们对网站进行了一些更改,但与身份验证无关。
我们在一个网络农场中,我们在web.config中定义我们的机器密钥。
<machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" decryption="AES" />
我们的目标是asp.net 4.5
<httpRuntime targetFramework="4.5" executionTimeout="120" maxQueryStringLength="4096" minFreeThreads="72" minLocalRequestFreeThreads="88" maxRequestLength="32768" />
我们在IIS中重新创建了应用程序池。
- 不确定这是否重要,但我们使用IIS共享配置和共享证书
- 该问题发生在服务器场中的所有web服务器上,而不仅仅是一台
- 我们昨天在其中一台服务器上重新安装了操作系统。。。所以我们会看看这是否能解决问题
- 它似乎与内存使用无关。有时iis只使用4gb,有时使用6gb
- 它似乎与我们可以判断的某个页面执行无关
- 我已经针对内存转储运行了调试diag,没有任何线程运行长时间或疯狂的内存使用
是的,我们被难住了。感谢您的帮助。
我也有类似的经历,更改IIS以允许匿名身份验证为我解决了这个问题
- 尝试在IIS中启用匿名身份验证(请访问http://technet.microsoft.com/en-us/library/cc770966%28v=ws.10%29.aspx看看如何)
- 修改您的代码,如下所示
<location path="signin">
<system.web>
<authorization>
<allow users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
我希望这能帮助
我将用我们解决问题的方法来回答我自己的问题,尽管我们从未找到根本原因。我们注意到,当服务器负载过重时,它会开始忽略白名单规则。负载不多,在5分钟内可能有40%的利用率。在那之后,它就会开始忽视事情。
对我们来说,简单的解决方案是在这个问题上投入更多的硬件。我们正在运行6台Web服务器,而不是3台。从那以后,我们再也没有看到过白名单问题。老实说。。。我们不知道发生了什么事。
虽然我不能确切地说问题是什么,但我可以分享类似的经验。我们有一个使用表单身份验证的网站,也认为它失败了,并迫使每个人都进行身份验证。我们发现该网站正在崩溃,IIS正在返回默认网站。我们花了一段时间才弄明白。你可能想检查一下,以确保你没有看到类似的情况。
您可以在web.config中显示您的身份验证节点吗?应该是这样的:
<authentication mode="Forms">
<forms name="Logon" loginUrl="~/Logon.aspx" protection="All" timeout="60" defaultUrl="~/Default.aspx" />
</authentication>
您正在使用asp.net会话状态服务器吗?如果您确实检查了服务asp.net状态服务器是否已启动。