Asp.net如何随机停止服从表单认证白名单?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (54)

问题

上个月,我们将我们的asp.net网站服务器场从Server 2008 R2迁移到Server 2012 R2,并升级到了asp.net 4.5。我们正在使用身份验证来防止未经授权访问网站。

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

我们有一些属性和页面(例如:登录页面)在web.config列入白名单:

<location path="signin">
   <system.web>
     <authorization>
       <allow users="*" />
     </authorization>
   </system.web>
</location>

在过去几个月中,我们一直注意到IIS / Asp.net会随机停止服从白名单,并假设所有需要进行身份验证。所有对该服务器上的站点的请求都将被重定向到登录页面,然后引发500错误。没有列入白名单的资产可以被检索。

在事件查看器中有2个错误,我们可以看到IIS被搞乱了。首先:

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. 我们在一个webfarm中,并且在我们的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. 我已经针对内存转储运行了调试诊断,并且没有任何线程运行时间过长或内存使用率过高。
提问于
用户回答回答于

尽管我们从未找到根本原因,但我会用我们解决问题的方法回答自己的问题。我们注意到,服务器在负载过重时会开始忽略白名单规则。没有多少负载,可能在5分钟内使用率为40%。之后,它会开始无视事情。

对我们来说简单的解决方案就是在这个问题上抛出更多的硬件。我们运行的是6个Web服务器,而不是3个。从那时起,我们还没有看到白名单问题。老实说...我们不知道发生了什么。

用户回答回答于

我有一个类似的经验,更改IIS以允许匿名身份验证为我解决。在你的情况下,我会推荐2件事情:

  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>

扫码关注云+社区