星期四, 5月 25, 2017

使用者更名後 User.Identity.Name 還是更名前名字

今天發生了非常奇怪的事情,有位員工的帳號更改,在某個Windows Server 2003的Asp.Net程式一直抓到他原來的名字,也就是使用 User.Identity.Name 一直是舊的資料。
我先使用 iisreset,但仍然沒用。逐步檢查程式也沒錯,另外建一個Web App還是相同,但是在別台Server就正常。最後使用大絕招,整臺Server重開機就好!原來是Windows Server 2003 內建的Cache機制造成,以後debug還是用傳統的reboot大絕嗎?

Update: 感謝Ricky Chiang提供資料,可以看KB

狀況

請考慮下列情況:
  • 在網域成員電腦上,應用程式會呼叫LsaLookupSids函式,若要翻譯的使用者名稱的安全性識別項 (SID)。
  • 使用者名稱已變更網域控制站上。
在這個案例中, LsaLookupSids函式可能會傳回舊的使用者名稱,而不是新的使用者名稱。這種行為可能會導致應用程式無法正常運作。

原因

本機安全性授權 (LSA) 會快取的 SID 和網域成員電腦上的本機快取中的使用者名稱之間的對應。快取的使用者名稱與網域控制站不同步。LSA 在網域成員電腦上的會先查詢本機 SID 快取。如果現有的對應已經是本機的 SID 快取中,LSA 就會傳回快取的使用者名稱資訊,而不會查詢的網域控制站。這種行為被要改善效能。

快取項目執行逾時時間,不過機會,週期性的查詢,由應用程式保留現有的快取項目還活著的快取項目的最大存留期。

因應措施

若要解決這個問題,請停用本機的 SID 快取中,網域成員電腦上。若要執行這項操作,請參考下列步驟:
  1. 開啟 [登錄編輯程式]。

    若要在 Windows XP 中,或在 Windows Server 2003 中,請執行這項操作,按一下 [開始],按一下 [執行、 輸入regedit,然後按一下[確定]

    若要在 Windows Vista 中和較新,請執行這項操作,請按一下 [開始],開始搜尋] 方塊中輸入regedit ,然後按 ENTER 鍵。
  2. 找出並用滑鼠右鍵按一下下列登錄子機碼︰
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
  3. 指向 [新增],然後按一下 [ DWORD 值
  4. 輸入LsaLookupCacheMaxSize,然後再按 ENTER 鍵。
  5. 以滑鼠右鍵按一下LsaLookupCacheMaxSize,,,然後按一下 [修改]
  6. 在 [數值資料] 方塊中,輸入0,然後按一下[確定]
  7. 結束登錄編輯程式。
注意LsaLookupCacheMaxSize 登錄項目設定可以儲存在本機的 SID 快取的快取對應的最大數目。預設的上限為 128。LsaLookupCacheMaxSize 登錄項目設為 0 時,會停用本機的 SID 快取。

狀態

行為是經過設計規劃。

更多的資訊

的 LSA 維護的 SID 快取,網域成員電腦上。此快取會儲存 Sid] 和 [使用者名稱之間的對應。如果 SID 資訊存在於本機快取,LSA 就會傳回快取的使用者名稱資訊,而非檢查是否已變更的使用者名稱。

本機的 SID 快取可以降低網域控制站的工作負載和網路流量。不過,本機快取和網域控制站之間的不一致可能會發生。

參考

TechNet 有涵蓋 Sid 名稱解析方法,包括此快取的詳細的說明的文章︰

http://technet.microsoft.com/en-us/library/ff428139(WS.10).aspx

如需有關LsaLookupSids函式,請造訪下列 Microsoft 網站︰

1 則留言:

Ricky Chiang 提到...


https://stackoverflow.com/questions/168946/iis-returning-old-user-names-to-my-application

可能有關係