C# - Felhasználói azonosítás lehetőségei ASP.NET-es alkalmazásban

Felhasználói azonosítás 1. rész

forráskód letöltése
Új cikksorozatunkban annak járunk utána, hogy milyen lehetőségeink vannak egy webes alkalmazás fejlesztésekor a felhasználók azonosítására. Mivel a web site-ok többségénél elkerülhetetlen az, hogy meg tudjuk állapítani, hogy aktuálisan ki is nézi web oldalainkat, így nem árt tisztában lennünk a lehetőségekkel, melyek az ASP.NET-ben rendelkezésünkre állnak.
Sorozatunk első részében két részre osztjuk az alkalmazásunk web lapjait: az egyiket bárki, azonosítás nélkül megtekintheti, a másik csoportba kerülő lapokat csak bejelentkezés után lehet elérni.
A mellékelt példában létrehozunk egy Default.aspx lapot. Ez lesz a programunk nyitó lapja, melyet bejelentkezés nélkül is bárki megtekinthet. A másik ilyen lap a Login.aspx lesz. Ezen az oldalon valósítjuk meg azt, hogy a felhasználók megadhassák bejelentkező nevüket és jelszavukat.
Ezeken kívül létrehozunk még két oldalt Secret.aspx és SecretTwo.aspx névvel. E két lapot csak akkor láthatja majd a felhasználó, ha már sikeresen bejelentkezett. Ennek hiányában automatikusan a Login.aspx oldalra lesz irányítva a felhasználó.
Mind a négy létrehozandó lapon elhelyezünk további linkeket, melyek segítségével lépkedhetünk az egyik oldalról a másikra, továbbá minden oldalon jelezzük azt is, hogy ki az aktuálisan bejelentkezett felhasználó, feltéve, hogy van már ilyen.
Először is nézzük meg azt, hogy miként tudunk bizonyos lapokat elérhetővé tenni és más lapokat miként rejthetünk el az azonosítatlan felhasználók elől. A megoldást a web.config állományban kell keresnünk.
A Default.aspx lap könyvtárában lévő web.config állományba létrehozunk egy authorization nevű bejegyzést. Itt az allow kulcs alatt a user attribútumban megadunk egy * és egy ? karaktert is. A csillag karakter képviseli az összes már azonosított felhasználót, míg a ? karakter az összes azonosítatlan felhasználóra vonatkozik. Mivel mindkét csoportot az allow kulcsszónál adtunk meg, ezzel azt értük el, hogy ezen web.config állomány mappájában lévő összes ASPX lap korlátozás nélkül mindenki számára hozzáférhető.
    <authorization>
      <allow users="*" /> 
      <allow users="?" />
    </authorization>
Ebből már sejthető, hogy ha rejtett oldalakat szeretnénk létrehozni, akkor azokat egy új könyvtárba kell tennünk, ahol egy új web.config állományban új szabályokat adunk meg. A Secret.aspx és SecretTwo.aspx lapokat ennek megfelelően egy Restricted könyvtárba helyezzük, ahol létrehozunk egy web.config állományt, melybe az alábbi kerül:
    <authorization>
        <deny users="?" />        
    </authorization>
Ebből pedig az következik, hogy minden olyan felhasználó aki még nem lett azonosítva, nem érheti el az itt található web oldalakat. Amint az látható, nem rendelkeztünk a már azonosított felhasználók sorsa felől. Erre nincs is szükségünk, mert az első web.config-ban már megtettük és mivel itt nem bíráltuk felül az ottani beállításokat, így azt örökölte ez a mappa is.
Rendelkeztünk tehát arról, hogy mely lapok láthatók névtelenül és melyek nem, viszont nem adtuk meg, hogy milyen módon történhet a felhasználói azonosítás. Ehhez térjünk vissza az első web.config állományhoz. Itt az authentication bejegyzés mode attribútumában adhatjuk meg, hogy milyen legyen a felhasználói azonosítás módja. Ez az alábbiak egyike lehet:
Mód Leírás
None nincs felhasználói azonosítás
Forms web form-on keresztüli azonosítás
Windows beépített Windows azonosítási rendszeren keresztül
Passport a Microsoft Passport rendszerén keresztül
Mi most a Forms módot választjuk. Ez esetben meg kell adnunk azt is, hogy melyik lesz az a web oldal, melyen keresztül a felhasználók képesek lesznek a bejelentkezés elvégzésére. Ehhez egy forms bejegyzést kell létrehoznunk, ahol a loginUrl attribútumban adható meg annak web oldalnak ez elérési útja, melyen keresztül be lehet jelentkezni. Ez a mi esetünkben a Login.aspx lesz.
    <authentication mode="Forms"> 
      <forms loginUrl="login.aspx"/>
    </authentication>
Ezeket megadva, ha a felhasználó olyan oldalt nyitna meg, mely az azonosítatlan személyek számára nem elérhető, akkor automatikusan erre az oldalra kerül. Ha itt sikeresen elvégezte a bejelentkezést, akkor pedig automatikusan arra az oldalra kerül, melyet meg szeretett volna nyitni, amikor még nem volt bejelentkezve.
Nézzük miként is történik egy felhasználó bejelentkeztetése, melyre a Login.aspx-ben kerül sor. Itt két TextBox-on keresztül meg kell adni a bejelentkező nevet és jelszót. Ezeket aztán programból ellenőriznünk kell, hogy elfogadjuk-e vagy sem. A példa egyszerűségének kedvéért most csak a „software” bejelentkező nevet és a „online” jelszót fogadjuk el. Ezt egy egyszerű if-el vizsgáljuk. Ha hibás, akkor megjelenítünk egy hibaüzenetet a Label3 segítségével. Ha jól lett megadva az adat, akkor pedig meghívjuk a FormsAuthentication osztály RedirectFromLoginPage függvényét. Első paraméterként a felhasználó nevét adjuk meg, míg a másodikban arról rendelkezhetünk, hogy a bejelentkezési adat kerüljön-e egy cookie formájában a felhasználó gépére, vagy sem.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      if (TextBox1.Text=="software" && TextBox2.Text=="online")
      {
        FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, false);      
      }
      else
      {
        Label3.Visible=true;
      }
    }
A cookie használata esetén, ha a felhasználó egyszer már sikeresen bejelentkezett és később ismét a web oldalunkra látogat, akkor az ő böngészője automatikusan elküldi a cookie-ban tárolt adatokat és ez által rögtön megtörténik a felhasználó azonosítása, így nem kell neki minden alkalommal bejelentkeznie.
A cookie tárolása viszont magában hordozza azt a veszélyt, hogy ha egy felhasználó bejelentkezett, de az ő számítógépe elé más is leülhet és az a személy is ellátogat a web oldalunkra, akkor neki már nem is kell bejelentkezni, hanem rögtön elérhet bármit, amire az első felhasználónak engedélye van.
Próbaképp állítsuk át a RedirectFromLoginPage függvény második paraméterét igazra, majd futtassuk a programot, jelentkezzünk be. Ezek után állítsuk le a programot és indítsuk újra. A második indítás után rögtön azonosítva leszünk bejelentkezés nélkül.
A cookie-ba az adatok titkosítva kerülnek, így onnan a felhasználói név, vagy jelszó nem olvasható ki. Mellékelt példánk az alábbi tartalmú cookie-t hozza létre:
.ASPXAUTH
99C120F60CB5C185A09273D0EE2D7F39117B1123546FFCD262AE1F92B7534EB02378F1E83DFE6369A0C196AD4DF30F058DF6F13C57B70635302CC95F86A3488AC5EF95050F416034
localhost/
1024
3533107328
33161482
349474176
29487594
*
A RedirectFromLoginPage függvény meghívása után az adott felhasználó az adott Session élettartama alatt azonosítva lesz, így nem kell minden kérésnél újra azonosítania magát, ezt automatikusan megtörténik. Persze, ha mondjuk egy új böngészőt indít el és ott szintén a mi web oldalunkra jön, akkor ebbe a böngészőbe ismét egy ismeretlen felhasználóként kerül ide, mivel ez már egy másik munkafolyamat, egy másik Session.
Bejelentkezés után arra is biztosíthatunk lehetőséget, hogy a felhasználó kijelentkezzen. Ekkor csak annyi a teendőnk, hogy a FormsAuthentication osztály SignOut függvényét meghívjuk. Ha esetleg cookie tárolása felől gondoskodtunk a bejelentkezéskor, akkor a SignOut hívásával töröltethetjük a felhasználó gépén lévő cookie-t, így mindenképpen újra be kell majd jelentkeznie.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      FormsAuthentication.SignOut();    
      Response.Redirect("Default.aspx");
    }
Ha szeretnénk a web lapra azt is kiírni, hogy ki az aktuálisan azonosított felhasználónk, akkor ehhez a User osztály Identity-jének Name property-jét kell használnunk. Ide az a felhasználói név kerül melyet azonosított a rendszerünk. Mielőtt ezt használnánk, célszerű megvizsgálnunk, hogy egyáltalán van-e azonosított felhasználója rendszerünknek vagy sem. Ehhez szintén a User osztály Identity property-je szükséges, csak most ennek IsAuthenticated logikai típusú property-jével tudjuk ezt a kérdést eldönteni.
      if (User.Identity.IsAuthenticated)
      {
        Label1.Text="<b>Bejelentkezett felhasználó:</b> " + User.Identity.Name;
      }

Felhasználói azonosítás cikksorozat