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,网站就会重新开始工作。

我们尝试过的东西

老实说,我们被难住了。这在我们的旧服务器上没有发生,但从那时起,我们对网站进行了一些更改,但与身份验证无关。

  1. 我们在一个网络农场中,我们在web.config中定义我们的机器密钥。

    <machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" decryption="AES" />
    
  2. 我们的目标是asp.net 4.5

    <httpRuntime targetFramework="4.5" executionTimeout="120" maxQueryStringLength="4096"  minFreeThreads="72" minLocalRequestFreeThreads="88"  maxRequestLength="32768" />
    
  3. 我们在IIS中重新创建了应用程序池。

  4. 不确定这是否重要,但我们使用IIS共享配置和共享证书
  5. 该问题发生在服务器场中的所有web服务器上,而不仅仅是一台
  6. 我们昨天在其中一台服务器上重新安装了操作系统。。。所以我们会看看这是否能解决问题
  7. 它似乎与内存使用无关。有时iis只使用4gb,有时使用6gb
  8. 它似乎与我们可以判断的某个页面执行无关
  9. 我已经针对内存转储运行了调试diag,没有任何线程运行长时间或疯狂的内存使用

是的,我们被难住了。感谢您的帮助。

Asp.net随机停止遵守表单身份验证白名单

我也有类似的经历,更改IIS以允许匿名身份验证为我解决了这个问题

  1. 尝试在IIS中启用匿名身份验证(请访问http://technet.microsoft.com/en-us/library/cc770966%28v=ws.10%29.aspx看看如何)
  2. 修改您的代码,如下所示
<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状态服务器是否已启动。