Asp.net随机停止服从表单身份验证白名单

Pau*_*mke 16 .net c# asp.net iis forms-authentication

问题

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

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

我们在web.config中列出了白名单的某些资产和页面(例如:登录页面):

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

在过去的几个月里,我们一直注意到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)
Run Code Online (Sandbox Code Playgroud)

第二个不会一直出现:

Event code: 4005 
Event message: Forms authentication failed for the request. Reason: The ticket supplied has expired. 
Run Code Online (Sandbox Code Playgroud)

iis进程将工作几个小时,然后突然开始做这个奇怪的事情.只要我们回收应用程序池,甚至只是修改web.config,该站点就会重新开始工作.

我们尝试过的事情

老实说,我们很难过.这在我们的旧服务器上没有发生,但从那时起我们对我们的网站进行了很多更改,但没有任何与身份验证相关的内容.

  1. 我们在webfarm中,我们在web.config中定义了我们的机器密钥.

    <machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" decryption="AES" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我们的目标是asp.net 4.5

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

  4. 不确定它是否重要但我们使用IIS共享配置和共享证书.
  5. 问题发生在服务器场中的所有Web服务器上,而不仅仅是一个.
  6. 我们昨天在其中一台服务器上重新安装了操作系统...所以我们会看看是否有任何修复.
  7. 它似乎与内存使用无关.有时iis只使用4gb,有时是6gb.
  8. 它似乎与我们可以告诉的某个页面执行无关.
  9. 我对内存转储运行debug diag,并且没有任何线程运行时间长,也没有疯狂的内存使用情况.

是的,我们很难过.任何帮助表示赞赏.

Pau*_*mke 1

我将用我们为解决问题所做的事情来回答我自己的问题,即使我们从未找到根本原因。我们注意到,当负载过重时,服务器会开始忽略白名单规则。负载不大,5 分钟内利用率可能达到 40%。之后它就会开始忽略事情。

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