[英]How to have LogonUser not use cached credentials?
我正在使用LogonUser驗證用戶的域憑據集。
LogonUser(accountName, domain, password,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token);
令人不安的結果:
LogonType Current Password Old password
=========== ============================== ========================
Network Succeeds Succeeds
Batch Fails (0x00000569) Fails (invalid password)
Interactive Succeeds Fails (invalid password)
失敗代碼:
0x00000569
: 登錄失敗:未在此計算機上為用戶授予請求的登錄類型 0x0000052E
: 登錄失敗:用戶名或密碼未知 細節:
true
。 (好) 如果用戶輸入無效憑證,則該函數返回false
。 (好)
如果用戶更改了密碼,並輸入新的有效憑證,則該函數返回true
。 (好)
如果用戶輸入無效憑證,則該函數返回false
。 (好)
如果用戶輸入舊憑證,則該函數返回true
。 (壞)
注意:如果用戶移動到另一台計算機(之前從未登錄過的計算機),並輸入舊憑據,則
LogonUser
繼續返回true 。 這意味着緩存不會發生在本地計算機上 - 但不知何故“ 在網絡上 ”。
true
。 (好) true
。 (壞) false
。 (好) 如何在調用LogonUser
時指示它指示域不使用緩存憑據 。
注意 :如果用戶試圖登錄到Windows舊(或舊舊的 )密碼,他們得到無效的密碼錯誤。
來自MSDN:
LOGON32_LOGON_NETWORK
此登錄類型適用於高性能服務器以驗證明文密碼。 LogonUser函數不會緩存此登錄類型的憑據 。
LOGON32_LOGON_INTERACTIVE
此登錄類型適用於將以交互方式使用計算機的用戶,例如由終端服務器,遠程shell或類似進程登錄的用戶。 此登錄類型具有為斷開連接的操作緩存登錄信息的額外費用; 因此,它不適合某些客戶端/服務器應用程序 ,例如郵件服務器。
LOGON32_LOGON_BATCH
此登錄類型適用於批處理服務器,其中進程可能代表用戶執行而無需直接干預。 此類型也適用於一次處理許多明文身份驗證嘗試的性能較高的服務器,例如郵件或Web服務器。
我正在驗證純文本密碼,因此使用LOGON32_LOGON_NETWORK
。 交互式登錄緩存憑據,此處不允許。 批量 ,雖然沒有記錄何時應該使用它,但是簡單地失敗了。
更新 :域只允許:
對我來說很明顯,它是Active Directory的一個“功能”,它給出了1小時的寬限期。
除了我不想要寬限期,我不想更改域上的任何設置(因為我不知道域上的任何設置將允許使用舊密碼一小時的寬限期) 。
這是NTLM的一個特色。 您可以更改默認的60分鍾。 通過在幾分鍾內將OldPasswordAllowedPeriod
DWORD值添加到域控制器上的HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa
鍵,或者您可以禁用“強制密碼歷史記錄”策略。 您也可以嘗試使用另一個登錄提供程序,如LOGON32_PROVIDER_WINNT50
。
順便說一句,如果您已經提供了GUI,我認為使用LOGON32_LOGON_INTERACTIVE
沒有任何不利之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.