2015. szeptember 15., kedd

HTTPS-re átirányítás, Form authentication és duplázódott URL paraméterek

Rendszeresen előfordult, hogy a felparaméterezett linkre bejelentkezést követően hibát dobott az ASP.NET codebehind, mondván, hogy nem megfelelő egy vagy több paraméter formátuma. A belépést követően megnézve a linket jogos volt a hibaüzenet, mivel duplázódott mindegyik paraméter, emiatt a QueryString vesszővel összefűzve adta vissza őket.

Ezt a duplázódást a Form authentication csinálta. Védett tartalom elérésekor átirányít a beléptető oldalra, és közben elteszi egy ReturnUrl paraméterbe az eredeti link URL kódolt változatát. Azért, hogy a beléptető oldalon is elérhetők legyenek a paraméterek anélkül, hogy az egész linket fel kéne dolgozni, melléteszi külön a paramétereket is, Ennek hatására a paraméterek kétszer fognak szerepelni: URL kódolva és anélkül.  

A probléma ott folytatódott, hogy nem volt a ReturnUrl tartalma URL kódolva. Kiderült, hogy a HTTP kérések HTTPS-re való átirányítása hibásan történt az ősosztály Page.OnLoadjában.

Az alábbi kód bár kézen fekvőnek tűnik, nem az elvártnak megfelelően működik, az URI.ToString() dekódolva adja vissza az URL-t:
Response.Redirect(Request.Url.ToString().Insert(4,"s"))

Egy lehetséges megoldás a helyes átirányításra:
Request.Url.Scheme + "s://" + Request.Url.Authority + Request.RawUrl;

A HTTPS-re való átirányítás után így már megmaradt a helyesen kódolt URL, azaz a ReturnUrl-ben benne volt a teljes eredeti hivatkozás és a Form authentication által hozzáfűzött paraméterlista is elérhető volt. Ennek ellenére a sikeres belépést követően mégis benne maradt az URL-ben a duplázott paraméterlista.

A user validálás után volt a másik hiba: az URL egyszerűen szét volt bontva a ReturnUrl mentén. Nem csak a ReturnUrl tartalmát adta vissza, hanem mindent, ami utána volt, így a duplázott paraméterlistát is.


--
A Form authenticationről bővebben:
http://blogs.msdn.com/b/vijaysk/archive/2008/01/24/anatomy-of-forms-authentication-return-url.aspx

Nincsenek megjegyzések:

Megjegyzés küldése