對於 HTTP 要求的 HTTP 400 不正確要求(要求標頭太長) 回應

當需要 Kerberos 驗證的 HTTP 要求傳送至裝載於 Internet Information Services (IIS) ,並設定為使用 Kerberos 驗證的網站時,HTTP 要求的標頭會非常長。 本文可協助您解決 HTTP 要求標頭太長時所發生的 HTTP 400 錯誤。

原始產品版本: W 2016
原始 KB 編號: 2020943

徵狀

需要 Kerberos 驗證的 HTTP 要求會從瀏覽器傳送至裝載於 IIS 上的網站。 該網站已設定為使用 Kerberos 驗證。 不過,您收不到預期的網頁,而是會收到類似以下的錯誤訊息:

HTTP 400 - 不正確的要求(要求標頭太長)

此回應可由包含 Windows Remote Management (WinRM) 的任何 HTTP 要求產生。

原因

如果使用者是許多 Active Directory 使用者群組的成員,就可能發生此問題。

伺服器的 HTTP 要求的 Kerberos 權杖包含在WWW-Authenticate標頭中。 標頭大小會隨著使用者群組的數目一起增加。 如果 HTTP 標頭或封包增加的大小超過伺服器上所設定的限制,伺服器可能會拒絕要求,並傳送錯誤訊息作為回應。

因應措施 1:減少 Active Directory 群組的數目

減少使用者所屬的 Active Directory 群組數目。

因應措施 2:設定 MaxFieldLength 和 MaxRequestBytes 登錄項目

增加伺服器上MaxFieldLengthMaxRequestBytes登錄項目的設定,讓使用者的要求標頭不會超過這些值。 若要判斷適當的設定,請使用下列計算:

  1. 使用下列文章所述的公式來計算使用者 Kerberos 權杖的大小:
    當使用者屬於許多個群組時,Kerberos 的驗證問題

  2. 將伺服器上的MaxFieldLengthMaxRequestBytes值設定為 4/3 * T 位元組,其中 T 是使用者的權杖大小,以位元組為單位。 HTTP 會使用 base64 編碼來編碼 Kerberos 權杖。

    注意事項

    這會以四個 base64 編碼的位元組取代每三個權杖中的位元組。 在您重新開機 HTTP 服務之前,對登錄所做的變更不會生效。 此外,您可能必須重新開啟任何相關服務,例如 IIS 服務。

視您的應用程式環境而定,您也可以藉由將網站設定為使用 Windows NT LAN Manager (NTLM) 而非 Kerberos 來解決此問題。 某些應用程式環境需要使用 Kerberos 驗證來進行委派。 我們認為 Kerberos 驗證比 NTLM 更安全。 建議您在考慮安全性和委派影響之前,不要停用 Kerberos 驗證。

其他相關資訊

預設情況下,沒有 MaxFieldLength 登錄項目。 此項目會指定每個 HTTP 要求標頭的大小上限。 MaxRequestBytes 登錄項目會指定要求行和標頭的總大小上限。 一般而言,此登錄項目會與 MaxRequestBytes 登錄項目一起設定。 如果 MaxRequestBytes 值低於 MaxFieldLength 值, 則會調整 MaxFieldLength 值。 在大型 Active Directory 環境中,如果這兩個項目的值都未設定為足夠高的值,使用者可能會遇到登入失敗。

針對 IIS 6.0 和更新版本, MaxFieldLengthMaxRequestBytes 登錄機碼位於下列子機碼:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

這些關鍵值如下表所示:

名稱 值類型 值資料
MaxFieldLength DWORD (4/3 * T 位元組) + 200
MaxRequestBytes DWORD (4/3 * T 位元組) + 200

您也可以將登錄機碼設定為最大值,如下表所示。 變更任何登錄設定之前,請考慮所有潛在的安全性影響。

名稱 值類型 值資料
MaxFieldLength DWORD 65536 (十進位) 或 10000 (十六進位)
MaxRequestBytes DWORD 16777216 (十進位) 或 1000000 (十六進位)

重要事項

變更這些登錄機碼應該視為極度危險。 這些登錄機碼允許傳送較大的 HTTP 封包至 IIS。 這可能會接著導致 Http.sys 使用更多記憶體。 因此,這類變更可能會使電腦遭受惡意攻擊的可能性提高。

如果 MaxFieldLength 設定為最大值 64 KB, MaxTokenSize 登錄值應設定為 3/4 * 64 = 48 KB。 如需詳細資訊了解 MaxTokenSize 設定,請參閱 當使用者屬於多個群組時,Kerberos 的驗證問題

參考