Átirányítás a bejelentkező oldalra Ajaxnál

A hitelesítés korrekt megvalósításának egyik legproblémásabb része annak megoldása, hogy mi történjen akkor, ha az alkalmazáshoz a szükséges engedélyek nélküli kérések érkeznek. Ez így nagyon bénán hangzik, úgyhogy íme egy példa: a /admin URL-re bejelentkezés nélkül nem érkezhetnek kérések, sőt még azokat a kéréseket is el kell utasítani, amik bejelentkezett felhasználóhoz tartoznak, de a felhasználó nincs az Admins csoportban.

ASP.NET esetén szerencsére a FormsAuthenticationModule modul gondoskodik a probléma megoldásáról. Az OnLeave eseménykezelővel feliratkozik az EndRequest eseményre, és ha a HTTP státusz kód 401, akkor átirányítja a felhasználót a bejelentkező oldalra. Ez egy kiváló szolgáltatás hagyományos kérések esetén, de kifejezetten kellemetlen Ajaxnál.

Az átirányítás hatására ugyanis a kliens nem kapja meg a 401 Unauthorized hibát, hanem egy 302 Redirect fejléc fog visszajönni a szervertől, amit az XMLHttpRequest kliens oldalon az előírásnak megfelelően transzparens módon követ, azaz beküld egy kérést a Location fejlécben megadott útvonalra. Ez az útvonal tipikusan a Login.aspx oldalra mutat, aminek a szerver visszaküldi a HTML kódját, és ezt a HTML kódot fogja megkapni az XHR az Ajax hívás eredményeként 200 OK státusz kóddal. Ember legyen a talpán, aki ezt a helyzetet kliens oldalon értelmesen kezelni tudja.

Sajnos .NET 4.0-ig nem volt más megoldás a probléma kezelésére, mint egy saját HTTP modul beillesztése az ASP.NET csővezetékbe. Az ASP.NET 4.5 azonban bevezetett egy új lehetőséget a HttpResponse.SuppressFormsAuthenticationRedirect tulajdonság formájában, amit true értékre állítva elkerülhető az átirányítás, és helyette az eredeti 401-es hibakódot fogja megkapni a kliens. Mivel ez a tulajdonság a Response része, ezért nem tudjuk globálisan beállítani, hanem minden olyan kérésnél be kell billenteni, ahol el akarjuk kerülni az átirányítást. Ha esetleg minden kérésnél így akarunk eljárni, akkor tehetjük ezt a tulajdonság állítást a global.asax fájlban lévő Application_EndRequest eseménykezelőbe.

Miután a kliens megkapja az egyértelmű hibakódot, JavaScriptből már úgy járhatunk el, ahogy az igényeink megkívánják, például feldobhatunk egy hibaüzenetet vagy egy bejelentkező ablakot. De ez a kód már eddig is megvolt, nem igaz?

 

Technorati-címkék: ,,

One thought on “Átirányítás a bejelentkező oldalra Ajaxnál

  1. apr

    A HttpResponse.SuppressFormsAuthenticationRedirect 4.5-ös új feature használata nekem nem jó megoldás, mert normál kéréseknél meg általában kéne a redirect. De ez a beállítás nem csak az ajaxra kapcsolja ki a redirectet.

    Helyette én ezt használom, ami asp.net 4.0 és korábbi alatt is működik.

    protected void Application_EndRequest( )
    {
    if( Context.Response.StatusCode == 302 && Context.Request.Headers[ “X-Requested-With” ] == “XMLHttpRequest” && !string.IsNullOrEmpty( Context.Response.RedirectLocation ) && Context.Response.RedirectLocation.StartsWith( “/Account/Signin” ) )
    {
    Context.Response.Clear( );
    Context.Response.StatusCode = 401;
    }
    }

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s