首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Windows 整合驗證登入 SQL Server 失敗:Kerberos Token 體積過大導致 MaxTokenSize/MaxFieldLength/MaxRequestBytes 需同步調整

     編輯:關於SqlServer

企業環境中,使用者隸屬大量 Active Directory 群組時,Kerberos Token 體積會超過預設限制,導致 Windows 整合驗證(Kerberos/NTLM)連線 SQL Server、SSRS、IIS 網頁應用程式失敗。單純調整註冊表 MaxTokenSize 不足,必須同步調整 IIS 相關參數 MaxFieldLength 與 MaxRequestBytes,並重啟相關服務。

問題現象

  • SQL Server Management Studio 連線正常(已調整 MaxTokenSize)。
  • Web 應用程式(含 SSRS)報錯:HTTP 400 Bad Request - Request Header too long 或直接顯示「網頁無法顯示」。
  • 使用 IP 位址直接存取網頁正常,但使用主機名/別名(觸發 Kerberos)失敗。
  • 任何透過 Web 應用程式執行的 SQL 查詢皆失敗。

根本原因

Kerberos Token 隨著使用者群組成員資格增長,封裝在 HTTP 標頭 Authorization: Negotiate <base64_token> 中。當 Token 超過下列預設限制,連線即被拒絕:

參數預設值建議值位置
MaxTokenSize1200 bytes48000 (或更大)HKLM\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
MaxFieldLength16384 bytes65534IIS 5.0: HKLM\System\CurrentControlSet\Services\W3SVC\Parameters
IIS 6.0+: HKLM\System\CurrentControlSet\Services\HTTP\Parameters
MaxRequestBytes16384 bytes500000同上(僅 IIS 6.0+)

完整解決步驟

  1. 調整 LSA 註冊表(已完成):MaxTokenSize = 48000 (DWORD),重啟 SQL Server 服務。
  2. 調整 IIS 註冊表(關鍵補充):
    ; IIS 6.0 / 7.x / 8.x / 10.0 (HTTP.sys)
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters]
    "MaxFieldLength"=dword:0000fffe   ; 65534
    "MaxRequestBytes"=dword:0007a120  ; 500000
    
  3. 重啟 IIS 相關服務:iisreset /restart 或重啟 HTTP、W3SVC 服務,不需重啟作業系統。
  4. 關閉 IE 友善錯誤訊息(診斷用):Internet 選項 → 進階 → 取消勾選「顯示友善 HTTP 錯誤訊息」,即可看到真實 400 Bad Request 狀態碼。

驗證與後續維護

  • 使用 klist tokensize 查看當前 Token 大小。
  • 定期審計 AD 群組巢狀深度,避免 Token 持續膨脹。
  • 考慮改用 SQL Server 驗證 或 Azure AD / Entra ID 繞過 Kerberos Token 體積限制。
  • 若使用負載平衡器,確認其 HTTP 標頭大小限制同步調整。

相關錯誤代碼對照

錯誤可能原因
HTTP 400 Bad RequestRequest Header > MaxFieldLength
HTTP 413 Request Entity Too LargeRequest Body > MaxRequestBytes
Kerberos KRB_AP_ERR_MODIFIEDSPN 重複/錯誤、Token 截斷
SECBUFFER_TOO_SMALLMaxTokenSize 不足

核心原則:Kerberos Token 大小限制存在於 LSA、HTTP.sys、負載平衡器、Proxy 等多層,必須全鏈路同步調大,缺一不可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved