8

(有关更多上下文,请参见下面的问题):

有没有什么情况

<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_BeginRequestApplication_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 异常(“填充无效,无法删除。”)

为什么是这样?


表单身份验证 cookie 与会话状态无关。

4

3 回答 3

3

我们的应用程序是无状态的(不需要会话),但我们遇到过应用程序池回收导致服务器环境中所有机器密钥加密的 cookie 失效的情况(上述问题)。这是因为机器密钥随着每次回收而变化,这不应该是这种情况

AutoGenerate 修饰符指定 ASP.NET 生成一个随机密钥并将其存储在本地安全机构 (LSA) 中

https://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

“本地安全机构 (LSA)”是指分配给应用程序池的用户,有关更多详细信息,请参见下文,因为事实证明这是问题所在。

问题在于我们使用专用用户帐户来运行应用程序池,并且简单地创建用户然后将其分配给应用程序池似乎并没有触发创建机器密钥所在的注册表部分存储。您可以通过检查注册表自己验证这一点

  1. HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProfileList(用于获取您刚刚创建的用户的 SID;如果用户不在那里,那么这已经是一个不好的迹象)
  2. HKU/[UserSIDFromBefore]/Software/Microsoft/ASP.NET/...(机器密钥应该存储在那里)

解决方案是在计算机上以该用户身份登录一次(正常的 Windows 登录屏幕),以便创建相关的注册表部分。不过,可能有更快或更微妙的方法来建立注册表部分。

于 2018-06-19T02:57:50.263 回答
1

Internet 信息服务 (IIS) 7.0(Windows Vista、Windows Server 2008)引入了应用程序池标识,这是一种新的隔离机制,有助于为运行 ASP.NET 应用程序的服务器提供更高的安全性。但是,以应用程序池身份运行的站点无权访问 HKCU 注册表。这是 ASP.NET 运行时存储其自动生成的密钥的地方。结果是 ASP.NET 在重置应用程序池时无法保留自动生成的密钥。因此,每次重置 w3wp.exe 时,都会生成一个新的临时密钥。注意 这在 IIS 7.5(Windows 7、Windows Server 2008 R2)和更高版本中不是问题。在这些版本的 IIS 上,ASP.NET 可以将其自动生成的密钥保存在不同的位置,以便在应用程序池重置后继续存在。

https://support.microsoft.com/en-us/help/2915218/resolving-view-state-message-authentication-code-mac-errors

于 2020-03-02T16:24:32.913 回答
-2

表单身份验证 cookie 与会话状态无关。

于 2009-07-10T14:16:00.523 回答