Az ASP.NET Login vezérlőnek van egy DestinationPageUrl tulajdonsága, amellyel megadhatjuk annak az oldalnak a címét, ahova sikeres bejelentkezés után a vezérlő továbbdob. Ez szép is lenne, már ha működne.
Az esetek nagy részében a Login vezérlőt feldobjuk egy Login.aspx oldalra és a LoginStatus vezérlővel irányítjuk a felhasználót erre az oldalra. A LoginStatus azonban nem egyszerűen a Login.aspx URL-t adja meg az átirányítás céljaként, hanem utánafűz egy ?ReturnUrl= kezdetű query stringet. Ha a Login vezérlő talál ReturnUrl-t a query stringben, akkor annak az értéke elsőbbséget élvez a DestinationPageUrl tulajdonsággal szemben és az ott megadott oldalra jut a felhasználó sikeres bejelentkezés után.
A kérdés már csak az, hogy mi van akkor, ha szeretném felülbírálni a LoginStatus okoskodását – például URL rewriting miatt – és én szeretném beállítani, hogy melyik oldal jelenjen meg bejelentkezés után? Természetesen a LoginStatus vezérlőnek nincs ilyen tulajdonsága...
Némi Reflectorozás után rájöhetünk, hogy az internal FormsAuthentication.GetReturnUrl metódus felelős a visszatérési cím összeállításáért. Ez először megnézi, hogy van-e ReturnUrl a query stringben és ha nincs (miért is lenne??), akkor még megnézi a Request.Form gyűjteményben is. Nincs más dolgunk, mint biztosítani azt, hogy a Formban legyen ilyen érték, amit legegyszerűbben úgy tehetünk meg, hogy létrehozunk az oldalra egy ilyen nevű rejtett mezőt – fontos, hogy a name attribútuma ReturnUrl legyen.
Ez sem olyan egyszerű, mint gondolnánk:
- A HiddenField vezérlőnek nincs Name tulajdonsága, sőt Attributes sincs :(
- A HtmlInputHidden vezérlőnek van Name tulajdonsága, de az ID alapján automatikusan kap értéket :(
- Marad a HtmlGenericControl:
HtmlGenericControl c = new HtmlGenericControl();
c.TagName = "input";
c.Attributes[ "name" ] = "ReturnUrl";
c.Attributes[ "type" ] = "hidden";
c.Attributes[ "value" ] = myUrl;
this.Form.Controls.Add( c );
Ha ezt a kódot betesszük az oldalon a Page_Loadba, akkor a LoginStatus a ReturnUrl query string megépítésénél a myUrl értékét fogja használni, a Login vezérlő pedig oda fogja irányítani a felhasználót bejelentkezés után.