0

当用户登录我们的站点时,会创建一个 FormsAuthenticationTicket。最近,我们进行了更改,将加密字符串添加为票证名称的一部分。事实证明,某些字符串在加密时变得无法被 IIS 读取,并且当受影响的用户登录时会引发此错误:

System.ArgumentException:值不在预期范围内。

堆栈跟踪:[ArgumentException:值不在预期范围内。] System.Web.Hosting.IIS7WorkerRequest.SetPrincipal(IPrincipal user) +11710943 System.Web.Security.FormsAuthenticationModule.OnAuthenticate(FormsAuthenticationEventArgs e) +379 System.Web。 Security.FormsAuthenticationModule.OnEnter(Object source, EventArgs eventArgs) +102 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +142 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +75 System.Web。 HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +93

该问题已修复,但受影响的用户需要清除其 ASPXAUTH cookie 才能再次登录。我们不知道有多少用户受到影响。但是,我们希望能够让他们在不清除 cookie 的情况下再次登录。

我尝试了几种解决方案来使会话令牌服务器端无效,但没有任何成功。我将代码添加到 Global.asax 以尝试在它出错之前捕获它,但是错误似乎来自 IIS,甚至在它到达我们的代码之前。在调试时,它在弹出错误之前从未命中 Global.asax 中的任何断点。我已经尝试过以下方法:Application_AuthenticateRequest Application_AcquireRequestState Session_OnStart Application_Start

我打算尝试一种类似于此处找到的解决方案:

https://www.jitbit.com/alexblog/282-invalidating-aspnet-forms-authentication-tickets-server-side/

并且只是使早于修补程序日期的令牌无效。但是,如果 IIS 在尝试读取票证时抛出错误,我似乎无法检查票证的日期。

我们将会话令牌保存在数据库中。我尝试在我们的测试服务器上清除那些,即使这样也没有解决它。编辑:我还尝试回收应用程序池,移动到另一个应用程序池,并执行 iisreset。

有没有办法告诉客户端浏览器扔掉一个cookie?我尝试过的基于代码的解决方案没有奏效,那么有没有办法从 IIS 中做到这一点?或者可能在错误到达客户端之前捕获错误并使令牌无效?

4

0 回答 0