Asp.net

<machineKey decryptionKey=‘AutoGenerate’… 被 IIS 忽略。不會使先前會話的 cookie 無效

  • March 2, 2020

(有關更多上下文,請參見下面的問題):

有沒有什麼情況

&lt;machineKey
     validationKey="AutoGenerate,IsolateApps"
     decryptionKey="AutoGenerate,IsolateApps"/&gt;

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 異常(“填充無效,無法刪除。”)

為什麼是這樣?

我們的應用程序是無狀態的(不需要會話),但我們遇到過應用程序池回收導致伺服器環境中所有機器密鑰加密的 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 登錄螢幕),以便創建相關的系統資料庫部分。不過,可能有更快或更微妙的方法來建立系統資料庫部分。

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

引用自:https://stackoverflow.com/questions/1106693