Soci (Soczó Zsolt) szakmai blogja

2012.08.28.

400 Bad Request – Request header too long

Filed under: IIS,SQL Server,Szakmai élet,Windows,Winternals — Soczó Zsolt @ 17:42

Reporting Services elérése közben jött a hiba, de IIS alatt is ugyanez lett volna a gond. A hiba oka, hogy a http.sys alapban 16kban korlátozza a http request hossszát, egy AD user access tokenje viszont nagyobb lehet ennél. Mivel a Kerberos auth (majdnem minden auth) a http headerben tolja át az auth infót, ha egy user nagyon sok csoportnak tagja az auth header nagyon nagy lehet. Esetünkben akinél jól ment 7k volt az össz kérés hossz, a beteg usernél 26 (Fiddlerrel néztük meg). Ez több mint 16, így természetes, hogy a http.sys kivágta.
A megoldás a limitek felemelése volt (MaxFieldLength és MaxRequestBytes registry értékek).
Bővebben az okról és a beállításokról itt. A beállítás a http stackre vonatkozik, user módú fogyasztótól (IIS, SQL Server, stb.) függetlenül.
Még egy dolog. A 2. cikk szerint újra kell indítani a http valamit. Ez látszólag szerviz, de nem az, hanem device driver. Mint ismert, 2003-tól és XP SP2-től a http.sys kernel módú driver fogadja a http kéréseket, ehhez írtak device drivert, mivel NT alatt így lehet kernel módban futtatni valamit. A service-ek között tehát nem látszik, hanem a Device Mangerben a Non Plug and Play kategória alatt lesz. Csak akkor hajlandó leállni, ha semmilyen user módú processz nem épít rá. Az összes http kiszolgáló erre épít, így az IIS és a Reporting Services is (meg az SQL Server http endpointjai, stb.). Esetünkben nem akart leállni, de a Reporting Services leállítása után azonnal leállt. Megúsztunk egy gép restartot, ami fájt volna, mivel ezen volt az SQL Server is.

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress