(有关更多上下文,请参见下面的问题):
有没有什么情况
<machineKey
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"/>
web.config 中的应用程序池回收时无法自动生成新的 machineKey?这是我看到的行为......
我在 MVC 应用程序中使用标准 ASP.NET FormsAuthentication。如果我让用户登录使用FormsAuthentication.GetAuthCookie
并且不使用持久性 cookie(依靠浏览器的会话来记住我的授权状态),我希望回收 IIS 应用程序池以使会话对此 cookie 的了解无效......因此注销所有没有持久性 cookie 的用户。
这确实发生在我的一个 IIS 安装 (XP) 上,但在不同的 IIS 配置 (Server 2K3) 上,FormsAuthentication cookie(在标准名称“.ASPXAUTH”下)仍然有效并继续授权用户。
有谁知道为什么会发生这种情况或什么配置控制这种行为?
显然,回收应用程序池无法控制浏览器是否仍然发送 .ASPXAUTH cookie(只要我没有关闭浏览器并且 cookie 没有过期)。
在 IIS 安装在回收后正确拒绝身份验证的情况下,我可以在事件Request.Cookies
期间看到传入的 cookie Application_BeginRequest
...但是一旦控制移动到 Global.asax.cs 中可用的下一个事件(Application_AuthenticateRequest
),cookie 已被删除从Request.Cookies
收藏。
为什么 IIS/ASP.NET 配置都不会发生这种情况?
如果不清楚,形成问题的更简单方法是:
当我在单个请求中从to步进时,为什么HttpContext.Current.Request.Cookies[".ASPXAUTH"]
从变为 null ?{System.Web.HttpCookie}
Application_BeginRequest
Application_AuthenticateRequest
更多调试信息:
如果我将以下代码附加到 Global.asax.cs 的 FormsAuthentication_OnAuthenticate 事件......
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null)
{
var val = cookie.Value;
try
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(val);
}
catch (Exception)
{
}
}
...然后在我回收 IIS 应用程序池之前的请求期间,不会捕获任何异常。回收 IIS 应用程序池后,当从浏览器发送完全相同的 .ASPXAUTH cookie 时,捕获到 Cryptographic 异常(“填充无效,无法删除。”)
为什么是这样?