Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
Megjegyzés:
A cikk írása óta a ASP.NET tagsági szolgáltatókat felváltotta ASP.NET Identity. Határozottan javasoljuk, hogy frissítse az alkalmazásokat az ASP.NET Identity platform használatára a cikk írásának időpontjában kiemelt tagsági szolgáltatók helyett. ASP.NET Identitás számos előnnyel rendelkezik a ASP.NET tagsági rendszerrel szemben, beleértve a következőket:
- Jobb teljesítmény
- Jobb bővíthetőség és tesztelhetőség
- Az OAuth, az OpenID Connect és a kéttényezős hitelesítés támogatása
- Jogcímalapú identitástámogatás
- Jobb együttműködés a ASP.Net Core-jal
Kód letöltése vagy PDF- letöltése
Ebben az oktatóanyagban a puszta vitafórumból a megvalósításba kerülünk; különösen az űrlaphitelesítés implementálását fogjuk megvizsgálni. Az oktatóanyagban megkezdett webalkalmazás a későbbi oktatóanyagokban is épülni fog, ahogy az egyszerű űrlaphitelesítésről a tagságra és a szerepkörökre váltunk.
Ebben a videóban további információt talál a következő témakörről: Az egyszerű űrlapok hitelesítésének használata ASP.NET.
Bevezetés
Az előző oktatóanyagban a ASP.NET által biztosított különböző hitelesítési, engedélyezési és felhasználói fiókbeállításokat tárgyaltuk. Ebben az oktatóanyagban a puszta vitafórumból a megvalósításba kerülünk; különösen az űrlaphitelesítés implementálását fogjuk megvizsgálni. Az oktatóanyagban megkezdett webalkalmazás a későbbi oktatóanyagokban is épülni fog, ahogy az egyszerű űrlaphitelesítésről a tagságra és a szerepkörökre váltunk.
Ez az oktatóanyag az űrlaphitelesítési munkafolyamat részletes áttekintésével kezdődik, amely az előző oktatóanyagban érintett témakör. Ezt követően létrehozunk egy ASP.NET webhelyet, amelyen keresztül bemutatjuk az űrlaphitelesítés fogalmait. Ezután úgy konfiguráljuk a webhelyet, hogy űrlaphitelesítést használjon, hozzon létre egy egyszerű bejelentkezési lapot, és megtudhatja, hogyan állapíthatja meg kódban, hogy a felhasználó hitelesítése megtörtént-e, és ha igen, milyen felhasználónévvel jelentkezett be.
Az űrlaphitelesítési munkafolyamat megismerése, a webalkalmazásban való engedélyezése, valamint a bejelentkezési és emblémázási lapok létrehozása elengedhetetlen lépés egy olyan ASP.NET alkalmazás létrehozásához, amely támogatja a felhasználói fiókokat, és egy weblapon keresztül hitelesíti a felhasználókat. Emiatt – és mivel ezek az oktatóanyagok egymásra épülnek – arra bátorítanám, hogy ezt az oktatóanyagot teljes egészében dolgozza át, mielőtt továbblépne a következőre még akkor is, ha már volt tapasztalata az űrlaphitelesítés konfigurálásával a korábbi projektekben.
Az Űrlaphitelesítési munkafolyamat ismertetése
Amikor a ASP.NET futtatókörnyezet feldolgoz egy ASP.NET-erőforrásra vonatkozó kérést, például egy ASP.NET lapot vagy ASP.NET webszolgáltatást, a kérés számos eseményt hoz létre az életciklusa során. Vannak olyan események, amelyek a kérelem elején és végén merülnek fel, amelyek a kérelem hitelesítése és engedélyezésekor merülnek fel, egy kezeletlen kivétel esetén előhozott esemény, és így tovább. Az események teljes listájának megtekintéséhez tekintse meg a HttpApplication objektum eseményeit.
A HTTP-modulok olyan felügyelt osztályok, amelyek kódját a kérelem életciklusának egy adott eseményére válaszul hajtják végre. ASP.NET számos HTTP-modullal rendelkezik, amelyek alapvető feladatokat végeznek a színfalak mögött. Két beépített HTTP-modul, amelyek különösen fontosak a vitánkhoz:
-
FormsAuthenticationModule– hitelesíti a felhasználót az űrlaphitelesítési jegy vizsgálatával, amely általában szerepel a felhasználó cookie-gyűjteményében. Ha nincs űrlaphitelesítési jegy, a felhasználó névtelen. -
UrlAuthorizationModule– meghatározza, hogy az aktuális felhasználó jogosult-e a kért URL-cím elérésére. Ez a modul az alkalmazás konfigurációs fájljaiban megadott engedélyezési szabályokkal egyeztetve határozza meg a szolgáltatót. ASP.NET tartalmazza aFileAuthorizationModule-t is, amely a kért fájl(ok) ACL-jével konzultálva határozza meg a jogosultságot.
A FormsAuthenticationModule megpróbálja hitelesíteni a felhasználót a UrlAuthorizationModule (és FileAuthorizationModule) végrehajtása előtt. Ha a kérelmet küldő felhasználó nem jogosult a kért erőforrás elérésére, az engedélyezési modul leállítja a kérést, és HTTP 401 Jogosulatlan állapotot ad vissza. A Windows-hitelesítési forgatókönyvekben a HTTP 401 állapota visszakerül a böngészőbe. Ez az állapotkód azt eredményezi, hogy a böngésző egy modális párbeszédpanelen kéri a felhasználótól a hitelesítő adatait. Űrlaphitelesítés esetén azonban a HTTP 401 Jogosulatlan állapot soha nem lesz elküldve a böngészőbe, mert a FormsAuthenticationModule észleli ezt az állapotot, és módosítja, hogy a felhasználót a bejelentkezési lapra irányítsa át ( HTTP 302 Átirányítási állapoton keresztül).
A bejelentkezési oldal feladata annak megállapítása, hogy a felhasználó hitelesítő adatai érvényesek-e, és ha igen, hozzon létre egy űrlaphitelesítési jegyet, és átirányítsa a felhasználót arra a lapra, amelyet megkísérl. A hitelesítési jegy szerepel a webhely lapjaira irányuló későbbi kérésekben, amelyek a FormsAuthenticationModule felhasználó azonosítására szolgálnak.
1. ábra: Az Űrlapok hitelesítési munkafolyamata
A hitelesítési jegy megjegyzése oldallátogatások során
A bejelentkezés után az űrlaphitelesítési jegyet minden kéréskor vissza kell küldeni a webkiszolgálónak, hogy a felhasználó bejelentkezve maradjon a webhelyen való böngészés közben. Ez általában úgy történik, hogy a hitelesítési jegyet a felhasználó cookie-gyűjteményében helyezi el. A cookie-k olyan kis szöveges fájlok, amelyek a felhasználó számítógépén találhatók, és a HTTP-fejlécekben minden kéréskor a cookie-t létrehozó webhelyre kerülnek. Ezért az űrlapok hitelesítési jegyének létrehozása és a böngésző cookie-jaiban való tárolása után a webhely minden későbbi látogatása elküldi a hitelesítési jegyet a kéréssel együtt, ezáltal azonosítva a felhasználót.
A cookie-k egyik aspektusa a lejáratuk, amely az a dátum és időpont, amikor a böngésző elveti a cookie-t. Az űrlaphitelesítési cookie lejárata után a felhasználó már nem hitelesíthető, ezért névtelenné válik. Amikor egy felhasználó egy nyilvános terminálról látogat, valószínűleg azt szeretné, hogy a hitelesítési jegy lejárjon, amikor bezárja a böngészőt. Az otthoni látogatáskor azonban előfordulhat, hogy ugyanaz a felhasználó szeretné, ha a hitelesítési jegyet a böngésző újraindítása során megjegyezné, hogy ne kelljen minden alkalommal bejelentkeznie, amikor meglátogatja a webhelyet. Ezt a döntést a felhasználó gyakran a bejelentkezési oldalon található "Emlékezzen rám" jelölőnégyzet formájában hozta meg. A 3. lépésben megvizsgáljuk, hogyan implementálhat egy "Emlékezzen rám" jelölőnégyzetet a bejelentkezési oldalon. Az alábbi oktatóanyag részletesen ismerteti a hitelesítési jegy időtúllépési beállításait.
Megjegyzés:
Lehetséges, hogy a webhelyre való bejelentkezéshez használt felhasználói ügynök nem támogatja a cookie-kat. Ilyen esetben ASP.NET használhat cookie nélküli űrlaphitelesítési jegyeket. Ebben a módban a hitelesítési jegy az URL-címre van kódolva. A következő oktatóanyagban áttekintjük, hogy mikor használják a cookie nélküli hitelesítési jegyeket, és hogyan jönnek létre és kezelhetők.
Az űrlap alapú hitelesítés hatáskörének felmérése
A FormsAuthenticationModule ASP.NET futtatókörnyezet részét képező felügyelt kód. A Microsoft Internet Information Services (IIS) webkiszolgálójának 7- es verziója előtt az IIS HTTP-folyamata és a ASP.NET futtatókörnyezeti folyamat között eltérő akadály lépett fel. Röviden: az IIS 6-os és korábbi verzióiban az FormsAuthenticationModule csak akkor van végrehajtva, amikor egy kérést az IIS az ASP.NET futtatókörnyezetnek delegál. Az IIS alapértelmezés szerint feldolgozza magát a statikus tartalmat – például HTML-lapokat, CSS-fájlokat és képfájlokat –, és csak akkor ad ki kéréseket a ASP.NET futtatókörnyezetnek, ha egy .aspx, .asmx vagy .ashx kiterjesztésű lapra van szükség.
Az IIS 7 azonban lehetővé teszi az integrált IIS- és ASP.NET-folyamatokat. Néhány konfigurációs beállítással beállíthatja az IIS 7-et, hogy meghívja az FormsAuthenticationModule-t az összes kéréshez. Az IIS 7-es verziójával emellett bármilyen típusú fájlok URL-engedélyezési szabályait is meghatározhatja. További információ: Az IIS6 és az IIS7 biztonság, a webplatform biztonsága és az IIS7 URL-hitelesítésének ismertetése.
Hosszú történet, az IIS 7 előtti verziókban csak űrlaphitelesítéssel védheti az ASP.NET futtatókörnyezet által kezelt erőforrásokat. Hasonlóképpen, az URL-engedélyezési szabályok csak a ASP.NET futtatókörnyezet által kezelt erőforrásokra vonatkoznak. Az IIS 7 használatával azonban integrálható a FormsAuthenticationModule és az UrlAuthorizationModule az IIS HTTP-folyamatába, így ez a funkció minden kérésre kiterjeszthető.
1. lépés: ASP.NET webhely létrehozása ehhez az oktatóanyag-sorozathoz
A lehető legszélesebb közönség elérése érdekében a ASP.NET webhely, amelyet ebben a sorozatban készítünk, a Microsoft ingyenes Visual Studio 2008, Visual Web Developer 2008 verziójával jön létre. A felhasználói tárolót SqlMembershipProvider egy Microsoft SQL Server 2005 Express Edition-adatbázisban fogjuk implementálni. Ha a Visual Studio 2005-öt vagy a Visual Studio 2008 vagy az SQL Server egy másik kiadását használja, ne aggódjon, a lépések szinte azonosak lesznek, és a nem triviális különbségek is megjelennek.
Megjegyzés:
Az egyes oktatóanyagokban használt bemutató webalkalmazás letöltésként érhető el. Ez a letölthető alkalmazás a .NET-keretrendszer 3.5-ös verziójához készült Visual Web Developer 2008-tal lett létrehozva. Mivel az alkalmazás a .NET 3.5-höz van megcélzva, a Web.config fájl további, 3,5-specifikus konfigurációelemeket tartalmaz. Röviden, ha még nem telepítette a .NET 3.5-öt az ön számítógépére, akkor a letölthető webalkalmazás nem fog működni, amíg először nem távolítja el a 3.5-specifikus jelölést a Web.config-ból.
Mielőtt konfigurálhatnánk az űrlaphitelesítést, először szükségünk van egy ASP.NET webhelyre. Először hozzon létre egy új fájlrendszeralapú ASP.NET webhelyet. Ehhez indítsa el a Visual Web Developert, majd nyissa meg a Fájl menüt, és válassza az Új webhely lehetőséget az Új webhely párbeszédpanel megjelenítésével. Válassza ki a ASP.NET webhelysablont, állítsa a Hely legördülő listát fájlrendszerre, válasszon egy mappát a webhely elhelyezéséhez, és állítsa a nyelvet C#-ra. Ezzel létrehoz egy új webhelyet egy Default.aspx ASP.NET laplal, egy App_Data mappával és egy Web.config fájllal.
Megjegyzés:
A Visual Studio két projektkezelési módot támogat: a webhelyprojekteket és a webalkalmazás-projekteket. A webhelyprojektek nem rendelkeznek projektfájllal, míg a webalkalmazás-projektek a Visual Studio .NET 2002/2003-ban a projektarchitektúrát utánozzák – egy projektfájlt tartalmaznak, és egyetlen szerelvénybe állítják össze a projekt forráskódját, amely a /bin mappába kerül. A Visual Studio 2005 kezdetben csak a webhelyprojekteket támogatta, bár a Web Application Project-modellt újra bevezették a Service Pack 1 csomaggal; A Visual Studio 2008 mindkét projektmodellt kínálja. A Visual Web Developer 2005 és 2008 kiadások azonban csak a webhelyprojekteket támogatják. A webhelyprojekt-modellt fogom használni. Ha nem Express kiadást használ, és inkább a Web Application Project-modellt szeretné használni, nyugodtan tegye meg, de vegye figyelembe, hogy a képernyőn megjelenő és a szükséges lépések és az oktatóanyagokban bemutatott képernyőképek és utasítások között eltérés lehet.
2. ábra: Új fájl létrehozása System-Based webhely (ide kattintva megtekintheti a teljes méretű képet)
Mesterlap hozzáadása
Ezután adjon hozzá egy új Mesteroldalt a webhelyhez a gyökérkönyvtárba Site.master néven. A mesterlapok lehetővé teszik, hogy a lapfejlesztők olyan webhelyszintű sablont definiáljanak, amely ASP.NET lapokra alkalmazható. A mesteroldalak fő előnye, hogy a webhely általános megjelenése egyetlen helyen határozható meg, ami megkönnyíti a webhely elrendezésének frissítését vagy finomhangolását.
3. ábra: Webhely.master nevű mesterlap hozzáadása a webhelyhez (ide kattintva megtekintheti a teljes méretű képet)
Itt definiálhatja a webhelyszintű lapelrendezést a mesterlapon. Használhatja a Tervező nézetet, és bármilyen elrendezés- vagy webes vezérlőt hozzáadhat, vagy manuálisan is hozzáadhatja a korrektúrát a Forrás nézetben. A mesterlap elrendezését úgy strukturáltam, hogy utánozzam a ASP.NET 2.0-s oktatóanyag-sorozatban az adatokkal való munka során használt elrendezést (lásd a 4. ábrát). A mesterlap kaszkádolt stíluslapokat használ a helymeghatározáshoz és a stílusokhoz a fájl Style.css megadott CSS-beállításokkal (amelyek az oktatóanyag társított letöltésében szerepelnek). Bár az alább látható korrektúra alapján nem lehet megállapítani, a CSS-szabályok úgy vannak definiálva, hogy a navigációs <div> tartalma teljesen úgy legyen elhelyezve, hogy a bal oldalon jelenjen meg, és rögzített szélessége 200 képpont legyen.
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Forms Authentication, Authorization, and User Accounts</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
<form id="form1" runat="server">
<div id="header">
<span class="title">User Account Tutorials</span>
</div>
<div id="content">
<asp:contentplaceholder id="MainContent" runat="server">
<!-- Page-specific content will go here... -->
</asp:contentplaceholder>
</div>
<div id="navigation">
TODO: Menu will go here...
</div>
</form>
</div>
</body>
</html>
A mesterlap a statikus lapelrendezést és a mesterlapot használó ASP.NET által szerkeszthető régiókat is meghatározza. Ezeket a szerkeszthető régiókat a ContentPlaceHolder vezérlő jelzi, amely a tartalom <div-on> belül látható. A mesterlap egyetlen ContentPlaceHolder (MainContent) tulajdonsággal rendelkezik, de a mesteroldalak több Tartalomhelyőrzővel is rendelkezhetnek.
A fenti korrektúra beírásával a Tervező nézetre váltva megjelenik a mesterlap elrendezése. Azok az ASP.NET oldalak, amelyek ezt a mesterlapot használják, egységes elrendezést kapnak, és megadhatja a jelölést a MainContent régió számára.
4. ábra: A mesterlap, ha a Tervező nézetben tekinti meg (kattintson ide a teljes méretű kép megtekintéséhez)
Tartalomlapok létrehozása
Ezen a ponton van egy Default.aspx lap a honlapunkon, de nem használja az imént létrehozott mesterlapot. Bár egy weblap deklaratív korrektúrájával kezelhető a mesterlap használata, ha a lap nem tartalmaz semmilyen tartalmat, egyszerűbb egyszerűen törölni a lapot, és újból hozzáadni a projekthez, megadva a használni kívánt mesterlapot. Ezért először törölje a Default.aspx a projektből.
Ezután kattintson a jobb gombbal a projekt nevére a Megoldáskezelőben, és válasszon egy új, Default.aspx nevű webes űrlapot. Ezúttal jelölje be a "Mesterlap kiválasztása" jelölőnégyzetet, és válassza ki a Site.master mesterlapot a listából.
5. ábra: Új Default.aspx lap hozzáadása mesterlap kiválasztásával (kattintson ide a teljes méretű kép megtekintéséhez)
6. ábra: A Site.master mesterlap használata
Megjegyzés:
Ha a webalkalmazás-projektmodellt használja, az Új elem hozzáadása párbeszédpanel nem tartalmazza a "Mesterlap kiválasztása" jelölőnégyzetet. Ehelyett hozzá kell adnia egy "Webes tartaloműrlap" típusú elemet. Miután kiválasztotta a "Webes tartaloműrlap" lehetőséget, és a Hozzáadás gombra kattintott, a Visual Studio a 6. ábrán látható Mesterválasztás párbeszédpanelt jeleníti meg.
Az új Default.aspx lap deklaratív korrektúrája csak egy @Page olyan irányelvet tartalmaz, amely meghatározza a mesterlap fájljának elérési útját, valamint a főlap MainContent ContentPlaceHolder eleméhez tartozó Tartalom vezérlőelemet.
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>
Egyelőre hagyja üresen Default.aspx. Az oktatóanyag későbbi részében visszatérünk hozzá tartalom hozzáadásához.
Megjegyzés:
A mesterlap egy menü vagy más navigációs felület egy szakaszát tartalmazza. Egy későbbi oktatóanyagban létrehozunk egy ilyen felületet.
2. lépés: Űrlaphitelesítés engedélyezése
A ASP.NET webhely létrehozásával a következő feladatunk az űrlaphitelesítés engedélyezése. Az alkalmazás hitelesítési konfigurációja a <authentication> Web.configelemén keresztül van megadva. Az <authentication> elem egyetlen, elnevezett módot tartalmaz, amely meghatározza az alkalmazás által használt hitelesítési modellt. Ez az attribútum a következő négy érték egyikével rendelkezhet:
- Windows – az előző oktatóanyagban ismertetett módon, amikor egy alkalmazás Windows-hitelesítést használ, a webkiszolgáló feladata a látogató hitelesítése, és ez általában alapszintű, kivonatolt vagy integrált Windows-hitelesítéssel történik.
- Űrlapok– A felhasználók hitelesítése egy weblap űrlapján keresztül történik.
- Passport – a felhasználók hitelesítése a Microsoft Passport Network használatával történik.
- Nincs – nincs hitelesítési modell; minden látogató névtelen.
Alapértelmezés szerint ASP.NET alkalmazások Windows-hitelesítést használnak. Ha a hitelesítési típust űrlapalapú hitelesítésre szeretné módosítani, akkor módosítania kell az <authentication> elem módattribútumát formsra.
Ha a projekt még nem tartalmaz Web.config fájlt, vegyen fel egyet a jobb gombbal a projekt nevére a Megoldáskezelőben, válassza az Új elem hozzáadása lehetőséget, majd vegyen fel egy webkonfigurációs fájlt.
7. ábra: Ha a projekt még nem tartalmazza a Web.config, adja hozzá most (kattintson ide a teljes méretű kép megtekintéséhez)
Ezután keresse meg az <authentication> elemet, és frissítse az űrlaphitelesítés használatára. A módosítás után a Web.config fájl korrektúrája az alábbihoz hasonlóan fog kinézni:
<configuration>
<system.web>
... Unrelated configuration settings and comments removed for brevity ...
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms" />
</system.web>
</configuration>
Megjegyzés:
Mivel Web.config XML-fájl, a casing fontos. Győződjön meg arról, hogy a módattribútumot a Forms értékre állítja, nagy "F" értékkel. Ha más burkolatot használ, például "űrlapokat", konfigurációs hibát fog kapni, amikor böngészőben látogatja meg a webhelyet.
Az <authentication> elem opcionálisan tartalmazhat egy <forms> gyermekelemet, amely űrlapalapú hitelesítésre vonatkozó beállításokat tartalmaz. Egyelőre csak az alapértelmezett űrlaphitelesítési beállításokat használjuk. A következő oktatóanyagban részletesebben is bemutatjuk <forms> a gyermekelemet.
3. lépés: A bejelentkezési oldal létrehozása
Az űrlaphitelesítés támogatásához webhelyünknek szüksége van egy bejelentkezési lapra. Ahogy az "Űrlaphitelesítési munkafolyamat ismertetése" szakaszban is szó volt róla, a FormsAuthenticationModule rendszer automatikusan átirányítja a felhasználót a bejelentkezési lapra, ha olyan lapot próbál elérni, amelyet nem jogosult megtekinteni. Vannak ASP.NET webes vezérlők is, amelyek a bejelentkezési lapra mutató hivatkozást jelenítik meg névtelen felhasználók számára. Ez a kérdés felmerül: "Mi a bejelentkezési oldal URL-címe?"
Alapértelmezés szerint az űrlaphitelesítő rendszer elvárja, hogy a bejelentkezési oldal neve Login.aspx legyen, és a webalkalmazás gyökérkönyvtárába kerüljön. Ha másik bejelentkezési lap URL-címét szeretné használni, ezt a Web.configmegadásával teheti meg. Ezt a következő oktatóanyagban fogjuk látni.
A bejelentkezési oldalnak három feladata van:
- Adjon meg egy felületet, amely lehetővé teszi a látogató számára a hitelesítő adataik megadását.
- Állapítsa meg, hogy a beküldött hitelesítő adatok érvényesek-e.
- A felhasználót az űrlaphitelesítési jegy létrehozásával jelentkezteti be.
A bejelentkezési lap felhasználói felületének létrehozása
Kezdjük az első feladattal. Adjon hozzá egy új ASP.NET lapot a webhely Login.aspx nevű gyökérkönyvtárához, és társítsa a Site.master mesterlaphoz.
8. ábra: Új ASP.NET lap hozzáadása elnevezett Login.aspx (ide kattintva megtekintheti a teljes méretű képet)
A tipikus bejelentkezési oldal felülete két szövegmezőből áll – egyet a felhasználó nevére, egyet a jelszavára – és egy gombot az űrlap elküldéséhez. A webhelyek gyakran tartalmaznak "Emlékezzen rám" jelölőnégyzetet, amely ha be van jelölve, a böngésző újraindítása során megőrzi az eredményként kapott hitelesítési jegyet.
Adjon hozzá két szövegdobozt a Login.aspx, és állítsa be a ID tulajdonságait a UserName és a Password értékre. A Password tulajdonságát állítsa TextMode Jelszó értékre is. Ezután adjon hozzá egy Jelölőnégyzet vezérlőelemet, amely a tulajdonságát a RememberMe értékre állítja ID , a tulajdonságát Text pedig a "Emlékezz rám" értékre. Ezt követően adjon hozzá egy LoginButton nevű gombot, amelynek Text a tulajdonsága "Login" (Bejelentkezés) értékű. Végül adjon hozzá egy Címke webvezérlőt, és állítsa a ID tulajdonságát InvalidCredentialsMessage értékre, a Text tulajdonságát pedig "Az Ön felhasználóneve vagy jelszava érvénytelen." Próbálkozzon újra. A ForeColor tulajdonsága Red, a Visible tulajdonsága pedig Hamis.
Ezen a ponton a képernyőnek a 9. ábrán látható képernyőfelvételhez hasonlóan kell kinéznie, és a lap deklaratív szintaxisának a következőhöz kell hasonlítania:
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<h1>
Login</h1>
<p>
Username:
<asp:TextBox ID="UserName" runat="server"></asp:TextBox></p>
<p>
Password:
<asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox></p>
<p>
<asp:CheckBox ID="RememberMe" runat="server" Text="Remember Me" /> </p>
<p>
<asp:Button ID="LoginButton" runat="server" Text="Login" OnClick="LoginButton_Click" /> </p>
<p>
<asp:Label ID="InvalidCredentialsMessage" runat="server" ForeColor="Red" Text="Your username or password is invalid. Please try again."
Visible="False"></asp:Label> </p>
</asp:Content>
9. ábra: A bejelentkezési oldal két szövegdobozt, egy jelölőnégyzetet, egy gombot és egy címkét tartalmaz (kattintással megtekintheti a teljes méretű képet)
Végül hozzon létre egy eseménykezelőt a LoginButton Kattintás eseményéhez. A Tervezőben egyszerűen kattintson duplán a Gomb vezérlőelemre az eseménykezelő létrehozásához.
Annak meghatározása, hogy a megadott hitelesítő adatok érvényesek-e
Most végre kell hajtanunk a 2. feladatot a gomb Kattintás eseménykezelőjében, amely meghatározza, hogy a megadott hitelesítő adatok érvényesek-e. Ehhez szükség van egy olyan felhasználói tárolóra, amely tartalmazza a felhasználók összes hitelesítő adatait, hogy megállapíthassuk, hogy a megadott hitelesítő adatok megfelelnek-e az ismert hitelesítő adatoknak.
A 2.0-s verzió ASP.NET előtt a fejlesztők a saját felhasználói tárolóik implementálásáért és a megadott hitelesítő adatok áruházon belüli ellenőrzéséhez szükséges kód megírásáért voltak felelősek. A fejlesztők többsége egy adatbázisban implementálná a felhasználói tárolót, és létrehozna egy Felhasználók nevű táblát olyan oszlopokkal, mint a UserName, a Password, az E-mail, a LastLoginDate stb. Ez a tábla tehát felhasználói fiókonként egy rekordot tartalmazna. A felhasználó által megadott hitelesítő adatok ellenőrzéséhez le kell kérdeznie az adatbázist egy megfelelő felhasználónévhez, majd gondoskodnia kell arról, hogy az adatbázisban lévő jelszó megfeleljen a megadott jelszónak.
A ASP.NET 2.0-s verziójával a fejlesztőknek az egyik tagságszolgáltatót kell használniuk a felhasználói tároló kezeléséhez. Ebben az oktatóanyag-sorozatban az SqlMembershipProvidert fogjuk használni, amely egy SQL Server-adatbázist használ a felhasználói tárolóhoz. Az SqlMembershipProvider használatakor egy adott adatbázissémát kell implementálni, amely tartalmazza a szolgáltató által várt táblákat, nézeteket és tárolt eljárásokat. A séma implementálását az SQL Server tagsági sémájának létrehozása oktatóanyagában fogjuk megvizsgálni. Ha a tagságszolgáltató működik, a felhasználó hitelesítő adatainak érvényesítése olyan egyszerű, mint a tagsági osztályValidateUser (felhasználónév, jelszó) metódusának meghívása, amely egy logikai értéket ad vissza, amely jelzi, hogy a felhasználónév és a jelszó kombináció érvényessége. Mivel még nem implementáltuk az SqlMembershipProvider felhasználói tárolóját, jelenleg nem használhatjuk a tagsági osztály ValidateUser metódusát.
Ahelyett, hogy időt szánnánk saját egyéni Felhasználók adatbázistábla létrehozására (amely elavult lenne az SqlMembershipProvider implementálása után), inkább vizsgáljuk meg az érvényes hitelesítő adatokat a bejelentkezési oldalon belül. A LoginButton Click eseménykezelőjében adja hozzá a következő kódot:
protected void LoginButton_Click(object sender, EventArgs e)
{
// Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
string[] users = { "Scott", "Jisun", "Sam" };
string[] passwords = { "password", "password", "password" };
for (int i = 0; i < users.Length; i++)
{
bool validUsername = (string.Compare(UserName.Text, users[i], true) == 0);
bool validPassword = (string.Compare(Password.Text, passwords[i], false) == 0);
if (validUsername && validPassword)
{
// TODO: Log in the user...
// TODO: Redirect them to the appropriate page
}
}
// If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = true;
}
Mint látható, három érvényes felhasználói fiók – Scott, Jisun és Sam – létezik, és mindháromnak ugyanaz a jelszava ("jelszó"). A kód végighalad a felhasználókon és a jelszótömbökön, és érvényes felhasználónevet és jelszót keres. Ha a felhasználónév és a jelszó is érvényes, be kell jelentkeznünk a felhasználóba, majd át kell irányítanunk őket a megfelelő oldalra. Ha a hitelesítő adatok érvénytelenek, akkor az InvalidCredentialsMessage címkét jelenítjük meg.
Amikor egy felhasználó érvényes hitelesítő adatokat ad meg, megemlítettem, hogy a rendszer ezután átirányítja őket a "megfelelő lapra". Mégis mi a megfelelő oldal? Ne feledje, hogy amikor egy felhasználó meglátogat egy olyan oldalt, amelyet nem jogosult megtekinteni, a FormsAuthenticationModule automatikusan átirányítja őket a bejelentkezési lapra. Ennek során a lekérdezésben a ReturnUrl paraméteren keresztül tartalmazza a kért URL-címet. Vagyis ha egy felhasználó megkísérli felkeresni ProtectedPage.aspx, és nem volt jogosult erre, a FormsAuthenticationModule a következőre irányítja át őket:
Login.aspx? ReturnUrl=ProtectedPage.aspx
A sikeres bejelentkezés után a felhasználót vissza kell irányítani a ProtectedPage.aspx. Másik lehetőségként a felhasználók saját akaratukból is felkereshetik a bejelentkezési oldalt. Ebben az esetben a felhasználó bejelentkezése után a gyökérmappa Default.aspx lapjára kell küldeni őket.
Felhasználó beléptetése
Feltételezve, hogy a megadott hitelesítő adatok érvényesek, létre kell hoznunk egy űrlaphitelesítési jegyet, ezáltal bejelentkezve a felhasználót a webhelyre. A System.Web.Security névtérFormsAuthentication osztálya válogatott módszereket biztosít a felhasználók űrlaphitelesítési rendszeren keresztüli bejelentkezéséhez és kijelentkeztetéséhez. Bár a FormsAuthentication osztályban több módszer is létezik, a három, ami érdekel minket ebben a junctúrában:
- GetAuthCookie(felhasználónév, persistCookie) – létrehoz egy űrlaphitelesítési jegyet a megadott felhasználónévhez. Ezután ez a metódus létrehoz és visszaad egy HttpCookie-objektumot, amely a hitelesítési jegy tartalmát tartalmazza. Ha a persistCookie igaz, állandó cookie jön létre.
- SetAuthCookie(felhasználónév, persistCookie) – meghívja a GetAuthCookie(felhasználónév, persistCookie) metódust az űrlap-hitelesítési cookie létrehozásához. Ez a módszer ezután hozzáadja a GetAuthCookie által visszaadott cookie-t a Cookie-gyűjteményhez (feltételezve, hogy a cookie-alapú űrlapok hitelesítése folyamatban van; ellenkező esetben ez a metódus egy belső osztályt hív meg, amely kezeli a cookie-mentes jegy logikáját).
- RedirectFromLoginPage(felhasználónév, persistCookie) – ez a metódus meghívja a SetAuthCookie-t (felhasználónév, persistCookie), majd átirányítja a felhasználót a megfelelő lapra.
A GetAuthCookie akkor hasznos, ha módosítania kell a hitelesítési jegyet, mielőtt a cookie-t a Cookie-gyűjteménybe íraná. A SetAuthCookie akkor hasznos, ha létre szeretné hozni az űrlaphitelesítési jegyet, és fel szeretné venni a Cookie-gyűjteménybe, de nem szeretné átirányítani a felhasználót a megfelelő lapra. Lehet, hogy meg szeretné tartani őket a bejelentkezési oldalon, vagy elküldené őket egy másik oldalra.
Mivel be szeretnénk jelentkezni a felhasználóba, és átirányítani őket a megfelelő lapra, használjuk a RedirectFromLoginPage parancsot. Frissítse a LoginButton Click eseménykezelőjét, és cserélje le a két megjegyzéssel ellátott TODO-sort a következő kódsorra:
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
Az űrlaphitelesítési jegy létrehozásakor a UserName TextBox Text tulajdonságát használjuk az űrlaphitelesítési jegy felhasználónév paraméteréhez, valamint a RememberMe CheckBox jelölőnégyzet bejelölt állapotát a persistCookie paraméterhez.
A bejelentkezési oldal teszteléséhez nyissa meg egy böngészőben. Először adjon meg érvénytelen hitelesítő adatokat, például a "Nope" felhasználónevet és a "hibás" jelszót. A Bejelentkezés gombra kattintva adatai visszaküldésre kerülnek, és megjelenik az Érvénytelen hitelesítési üzenet.
10. ábra: Az InvalidCredentialsMessage címke jelenik meg, amikor érvénytelen hitelesítő adatokat adnak meg (kattintson ide a teljes méretű kép megtekintéséhez)
Ezután adja meg az érvényes hitelesítő adatokat, és kattintson a Bejelentkezés gombra. Ekkor, amikor a visszaküldés megtörténik, létrejön egy űrlaphitelesítési jegy, és a rendszer automatikusan visszairányítja a Default.aspx oldalra. Ezen a ponton bejelentkezett a webhelyre, bár nincsenek vizuális jelek, amelyek jelzik, hogy jelenleg bejelentkezett. A 4. lépésben megtudhatja, hogyan állapíthatja meg programozott módon, hogy egy felhasználó bejelentkezett-e vagy sem, valamint hogyan azonosíthatja az oldalt látogató felhasználót.
Az 5. lépés a felhasználók webhelyről való kijelentkeztetésének technikáit vizsgálja.
A bejelentkezési oldal védelme
Amikor a felhasználó megadja a hitelesítő adatait, és elküldi a bejelentkezési lap űrlapját, a rendszer egyszerű szövegben továbbítja a hitelesítő adatokat – beleértve a jelszavát is – az interneten keresztül a webkiszolgálóra. Ez azt jelenti, hogy a hálózati forgalmat megszenvedő hackerek láthatják a felhasználónevet és a jelszót. Ennek megakadályozása érdekében elengedhetetlen a hálózati forgalom titkosítása a Secure Socket Layer (SSL) használatával. Ez biztosítja, hogy a hitelesítő adatok (valamint a teljes oldal HTML-jelölője) titkosítva legyenek attól a pillanattól kezdve, hogy elhagyják a böngészőt, amíg meg nem kapják őket a webkiszolgálótól.
Hacsak a webhelye nem tartalmaz bizalmas információkat, csak a bejelentkezési oldalon és más oldalakon kell SSL-t használnia, ahol a felhasználó jelszava egyébként egyszerű szöveges üzenetben lesz elküldve a vezetéken keresztül. Nem kell aggódnia az űrlaphitelesítési jegy biztonságossá tételével, mivel alapértelmezés szerint titkosítva és digitálisan is aláírva van (a módosítás megakadályozása érdekében). Az űrlaphitelesítési jegy biztonságáról az alábbi oktatóanyagban olvashat részletesebben.
Megjegyzés:
Számos pénzügyi és orvosi webhely úgy van konfigurálva, hogy ssl-t használjon a hitelesített felhasználók számára elérhető összes oldalon. Ha ilyen webhelyet hoz létre, konfigurálhatja az űrlaphitelesítő rendszert úgy, hogy az űrlaphitelesítési jegy csak biztonságos kapcsolaton keresztül legyen továbbítva.
4. lépés: Hitelesített látogatók észlelése és identitásuk meghatározása
Ezen a ponton engedélyeztük az űrlapok hitelesítését, és létrehoztunk egy egyszerű bejelentkezési oldalt, de még meg kell vizsgálnunk, hogyan állapíthatjuk meg, hogy a felhasználó hitelesített vagy névtelen. Bizonyos esetekben előfordulhat, hogy különböző adatokat vagy információkat szeretnénk megjeleníteni attól függően, hogy egy hitelesített vagy névtelen felhasználó felkeresi-e az oldalt. Emellett gyakran meg kell ismernünk a hitelesített felhasználó identitását.
Bővítsük a meglévő Default.aspx oldalt, hogy bemutassa ezeket a technikákat. A Default.aspx fájlban adjon hozzá két panelvezérlőt, az egyik az AuthenticatedMessagePanel nevű, a másik az AnonymousMessagePanel nevű. Vegyen fel egy WelcomeBackMessage nevű címkevezérlőt az első panelen. A második panelen adjon hozzá egy HyperLink-vezérlőt, állítsa a Text tulajdonságát "Bejelentkezés" értékre, a NavigateUrl tulajdonságát pedig "~/Login.aspx" értékre. Ezen a ponton az Default.aspx deklaratív korrektúrának a következőhöz hasonlóan kell kinéznie:
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<asp:Panel runat="server" ID="AuthenticatedMessagePanel">
<asp:Label runat="server" ID="WelcomeBackMessage"></asp:Label>
</asp:Panel>
<asp:Panel runat="Server" ID="AnonymousMessagePanel">
<asp:HyperLink runat="server" ID="lnkLogin" Text="Log In" NavigateUrl="~/Login.aspx"></asp:HyperLink>
</asp:Panel>
</asp:Content>
Ahogy már valószínűleg kitalálta, itt az a cél, hogy csak a Hitelesített üzenetpanelt jelenítsük meg a hitelesített látogatók számára, és csak a Névtelen üzenetpanelt a névtelen látogatók számára. Ehhez be kell állítani a panelek látható tulajdonságait attól függően, hogy a felhasználó bejelentkezett-e vagy sem.
A Request.IsAuthenticated tulajdonság logikai értéket ad vissza, amely jelzi, hogy a kérés hitelesítése megtörtént-e. Írja be a következő kódot az Page_Load eseménykezelő kódjába:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{
WelcomeBackMessage.Text = "Welcome back!";
AuthenticatedMessagePanel.Visible = true;
AnonymousMessagePanel.Visible = false;
}
else
{
AuthenticatedMessagePanel.Visible = false;
AnonymousMessagePanel.Visible = true;
}
}
Ezzel a kóddal keresse fel Default.aspx egy böngészőben. Feltételezve, hogy még be kell jelentkeznie, megjelenik a bejelentkezési lapra mutató hivatkozás (lásd a 11. ábrát). Kattintson erre a hivatkozásra, és jelentkezzen be a webhelyre. Ahogy a 3. lépésben láttuk, a hitelesítő adatok megadása után a rendszer visszaadja a Default.aspx, de ezúttal az oldalon az "Üdvözöljük újra!" üzenet jelenik meg (lásd a 12. ábrát).
11. ábra: Névtelenül látogatva megjelenik egy bejelentkezési hivatkozás
12. ábra: A hitelesített felhasználók az "Üdvözöljük újra!" üzenetet kapják
A httpContext objektumFelhasználói tulajdonságán keresztül meghatározhatjuk a felhasználó jelenleg bejelentkezett identitását. A HttpContext objektum az aktuális kéréssel kapcsolatos információkat jeleníti meg, és többek között olyan gyakori ASP.NET objektumok otthona, mint a Válasz, a Kérés és a Munkamenet. A User tulajdonság az aktuális HTTP-kérés biztonsági környezetét jelöli, és implementálja az IPrincipal felületet.
A Felhasználó tulajdonságot a FormsAuthenticationModule állítja be. Amikor a FormsAuthenticationModule egy űrlap-hitelesítési jegyet talál a bejövő kérelemben, létrehoz egy új GenericPrincipal objektumot, és hozzárendeli a User tulajdonsághoz.
Az egyszerű objektumok (például a GenericPrincipal) információt nyújtanak a felhasználó identitásáról és azokról a szerepkörökről, amelyekhez tartoznak. Az IPrincipal felület két tagot határoz meg:
- IsInRole(roleName) – olyan metódus, amely logikai értéket ad vissza annak jelzésére, hogy a felhasználó a megadott szerepkör tagja-e.
- Identitás – az IIdentity felületet megvalósító objektumot visszaadó tulajdonság. Az IIdentitási felület három tulajdonságot határoz meg: AuthenticationType, IsAuthenticated és Name.
Az aktuális látogató nevét az alábbi kóddal állapíthatjuk meg:
karakterlánc currentUsersName = User.Identity.Name;
Űrlaphitelesítés használatakor létrejön egy FormsIdentity objektum a GenericPrincipal identitástulajdonságához. A FormsIdentity osztály mindig a "Forms" sztringet adja vissza az AuthenticationType tulajdonságnak, és az IsAuthenticated tulajdonság esetében mindig igaz értéket ad. A Név tulajdonság az űrlaphitelesítési jegy létrehozásakor megadott felhasználónevet adja vissza. A Három tulajdonság mellett a FormsIdentity a mögöttes hitelesítési jegyhez való hozzáférést is tartalmazza a Ticket tulajdonságán keresztül. A Jegy tulajdonság egy FormsAuthenticationTicket típusú objektumot ad vissza, amely olyan tulajdonságokkal rendelkezik, mint az Elévülés, az IsPersistent, a IssueDate, a Name stb.
A fontos szempont, hogy a FormsAuthentication.GetAuthCookie(felhasználónév, persistCookie), FormsAuthentication.SetAuthCookie(felhasználónév, persistCookie) és FormsAuthentication.RedirectFromLoginPage(felhasználónév, persistCookie) metódusban megadott felhasználónév paraméter megegyezik a User.Identity.Name által visszaadott értékkel. Ezen felül az ezen metódusok által létrehozott hitelesítési jegy a User.Identity formsIdentity objektumra való kiosztásával, majd a Ticket tulajdonság elérésével érhető el:
FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;
Adjunk egy személyre szabottabb üzenetet a Default.aspx oldalon. Frissítse a Page_Load eseménykezelőt, hogy a WelcomeBackMessage címke Szöveg tulajdonsága a következő sztringhez legyen rendelve: "Üdvözöljük újra, felhasználónév!"
WelcomeBackMessage.Text = "Üdvözöljük újra, " + User.Identity.Name + "!";
A 13. ábra a módosítás hatását mutatja be (amikor Scott felhasználóként jelentkezik be).
13. ábra: Az üdvözlő üzenet tartalmazza az aktuálisan bejelentkezett felhasználó nevét
A LoginView és a LoginName vezérlők használata
A hitelesített és névtelen felhasználók számára különböző tartalmak megjelenítése gyakori követelmény; így jelenik meg az aktuálisan bejelentkezett felhasználó neve. Ezért ASP.NET két olyan webvezérlőt tartalmaz, amelyek ugyanazt a funkciót biztosítják, mint a 13. ábrán, de egyetlen kódsor írása nélkül.
A LoginView vezérlő egy sablonalapú webes vezérlő, amely megkönnyíti a különböző adatok megjelenítését a hitelesített és névtelen felhasználók számára. A LoginView két előre definiált sablont tartalmaz:
- AnonymousTemplate – a sablonhoz hozzáadott korrektúrák csak névtelen látogatók számára jelennek meg.
- LoggedInTemplate – a sablon korrektúrája csak hitelesített felhasználók számára jelenik meg.
Vegyük fel a LoginView vezérlőt webhelyünk mesteroldalára, a Site.master-be. AHelyett azonban, hogy csak a LoginView vezérlőt adhatnánk hozzá, adjunk hozzá egy új ContentPlaceHolder-vezérlőt, majd helyezzük a LoginView vezérlőt az új ContentPlaceHolderbe. Ennek a döntésnek az indoka hamarosan nyilvánvalóvá válik.
Megjegyzés:
Az AnonymousTemplate és a LoggedInTemplate mellett a LoginView vezérlő szerepkörspecifikus sablonokat is tartalmazhat. A szerepkörspecifikus sablonok csak az adott szerepkörhöz tartozó felhasználók számára jelenítik meg a korrektúrát. Egy későbbi oktatóanyagban megvizsgáljuk a LoginView vezérlő szerepköralapú funkcióit.
Először adjon hozzá egy LoginContent nevű ContentPlaceHolder-et a navigációs <div> elem mesteroldalához. Egyszerűen húzhat egy ContentPlaceHolder-vezérlőt az eszközkészletből a Forrás nézetbe, és az eredményül kapott jelölést közvetlenül a "TODO: Menü ide fog menni..." fölé helyezheti.
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Ezután adjon hozzá egy LoginView-vezérlőt a LoginContent ContentPlaceHolderben. A mesterlap ContentPlaceHolder vezérlőibe helyezett tartalom a ContentPlaceHolder alapértelmezett tartalma . Vagyis ASP.NET mesterlapot használó lapok saját tartalmat adhatnak meg minden Tartalomhelyőrzőhöz, vagy használhatják a mesterlap alapértelmezett tartalmát.
A LoginView és más bejelentkezéssel kapcsolatos vezérlők az Eszközkészlet Bejelentkezési lapján találhatók.
14. ábra: A LoginView vezérlő az eszközkészletben
Ezután adjon hozzá két <br/> elemet közvetlenül a LoginView vezérlő után, de továbbra is a ContentPlaceHolderben. Ezen a ponton a navigációs <div> elem jelölésének a következőképpen kell kinéznie:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
</asp:LoginView>
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
A LoginView sablonjai definiálhatók a Tervezőből vagy a deklaratív korrektúrából. A Visual Studio Tervezőjében bontsa ki a LoginView intelligens címkéjét, amely egy legördülő listában listázza a konfigurált sablonokat. Írja be a "Hello, stranger" szöveget az AnonymousTemplate mezőbe; Ezután adjon hozzá egy HyperLink-vezérlőt, és állítsa a Szöveg és a NavigateUrl tulajdonságait a "Bejelentkezés" és a "~/Login.aspx" értékre.
Az AnonymousTemplate konfigurálása után váltson a LoggedInTemplate-ra, és írja be a következő szöveget: "Üdvözöljük vissza, ". Ezután húzzon egy LoginName vezérlőt az eszközkészletből a LoggedInTemplate mappába, és helyezze el közvetlenül a "Welcome back" szöveg után. A LoginName vezérlőelem, ahogy a neve is mutatja, megjeleníti az aktuálisan bejelentkezett felhasználó nevét. A LoginName vezérlő belsőleg egyszerűen a User.Identity.Name tulajdonságot adja ki
Miután ezeket a kiegészítéseket a LoginView sablonjaihoz tette, a korrektúra a következőhöz hasonlóan fog kinézni:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />.
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
<asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
A Site.master mesterlap ezen hozzáadásával a webhelyünk minden oldala eltérő üzenetet jelenít meg attól függően, hogy a felhasználó hitelesítése megtörtént-e. A 15. ábrán az Default.aspx lap látható, amikor a felhasználó Jisun böngészőben látogatta meg. A "Welcome back, Jisun" üzenet kétszer ismétlődik: egyszer a mesterlap bal oldali navigációs szakaszában (az imént hozzáadott LoginView vezérlőn keresztül), és egyszer a Default.aspx tartalomterületén (panelvezérlők és programozott logika segítségével).
15. ábra: A LoginView vezérlő megjeleníti a "Welcome back, Jisun" szöveget.
Mivel hozzáadtuk a LoginView-t a mesterlaphoz, az a webhely minden lapján megjelenhet. Előfordulhat azonban, hogy vannak olyan weblapok, amelyeken nem szeretnénk megjeleníteni ezt az üzenetet. Az egyik ilyen oldal a bejelentkezési oldal, mivel a bejelentkezési oldalra mutató hivatkozás úgy tűnik, hogy nincs a helyén. Mivel a LoginView vezérlőt egy ContentPlaceHolderbe helyeztük a mesterlapon, felülírhatjuk ezt az alapértelmezett jelölést a tartalomoldalunkon. Nyissa meg Login.aspx, és nyissa meg a Tervezőt. Mivel nem definiáltunk explicit módon tartalomvezérlőt a Login.aspx fájlban a LoginContent ContentPlaceHolder-hez a mesterlapon, a bejelentkezési oldalon megjelenik a mesterlap alapértelmezett jelölése ehhez a ContentPlaceHolderhez. Ezt a Tervezőn keresztül tekintheti meg – a LoginContent ContentPlaceHolder megjeleníti az alapértelmezett korrektúrát (a LoginView vezérlőt).
16. ábra: A bejelentkezési oldal a mesterlap LoginContent ContentPlaceHolder elemének alapértelmezett tartalmát jeleníti meg (ide kattintva megtekintheti a teljes méretű képet)
A LoginContent ContentPlaceHolder alapértelmezett korrektúrának felülbírálásához egyszerűen kattintson a jobb gombbal a Tervezőben lévő régióra, és válassza az Egyéni tartalom létrehozása lehetőséget a helyi menüben. (A Visual Studio 2008 használatakor a ContentPlaceHolder tartalmaz egy intelligens címkét, amely a kijelöléskor ugyanazt a lehetőséget kínálja.) Ez egy új tartalomvezérlőt ad hozzá a lap korrektúrához, és ezáltal lehetővé teszi számunkra, hogy egyéni tartalmat határozzunk meg ehhez a laphoz. Itt hozzáadhat egy egyéni üzenetet, például a "Kérjük, jelentkezzen be...", de ezt hagyja üresen.
Megjegyzés:
A Visual Studio 2005-ben az egyéni tartalom létrehozása üres tartalomvezérlőt hoz létre a ASP.NET lapon. A Visual Studio 2008-ban azonban az egyéni tartalom létrehozása átmásolja a mesterlap alapértelmezett tartalmát az újonnan létrehozott Tartalom vezérlőelembe. Ha Visual Studio 2008-at használ, akkor az új tartalomvezérlő létrehozása után mindenképpen törölje a mesterlapról átmásolt tartalmat.
A 17. ábrán a Login.aspx lap látható, amikor a módosítást követően egy böngészőből látogatták meg. Vegye figyelembe, hogy a bal oldali navigációs divban< nincs "Hello, stranger" vagy "Welcome back, >" üzenet, mint amikor Default.aspx látogat.
17. ábra: A bejelentkezési oldal elrejti az alapértelmezett LoginContent ContentPlaceHolder korrektúrát (ide kattintva megtekintheti a teljes méretű képet)
5. lépés: Kijelentkezés
A 3. lépésben egy bejelentkezési oldal létrehozására voltunk kíváncsiak, amely be tud jelentkezni a webhelyre, de még nem tudtuk, hogyan lehet kijelentkeztetni egy felhasználót. A felhasználók naplózási módszerein kívül a FormsAuthentication osztály egy SignOut metódust is biztosít. A SignOut metódus egyszerűen megsemmisíti az űrlaphitelesítési jegyet, így kijelentkezteti a felhasználót a webhelyről.
A kijelentkezés hivatkozásának felkínálása olyan gyakori funkció, amely ASP.NET tartalmaz egy olyan vezérlőt, amelyet kifejezetten a felhasználó kijelentkeztetésére terveztek. A LoginStatus vezérlő egy "Login" LinkButton vagy egy "Logout" LinkButton értéket jelenít meg a felhasználó hitelesítési állapotától függően. A "Login" LinkButton névtelen felhasználók számára jelenik meg, míg egy "Kijelentkezés" LinkButton jelenik meg a hitelesített felhasználók számára. A "Login" és a "Logout" LinkButtons szövegét a LoginStatus LoginText és LogoutText tulajdonságaival lehet konfigurálni.
A "Bejelentkezés" link gombra kattintva egy postback történik, amely után a rendszer átirányít a bejelentkezési oldalra. A "Kijelentkezés" LinkButtonra kattintva a LoginStatus vezérlő meghívja a FormsAuthentication.SignOff metódust, majd átirányítja a felhasználót egy lapra. A kijelentkezett felhasználó által átirányított lap a LogoutAction tulajdonságtól függ, amely a következő három érték egyikéhez rendelhető hozzá:
- Frissítés – az alapértelmezett; átirányítja a felhasználót az éppen meglátogatott lapra. Ha az éppen meglátogatott oldal nem engedélyezi a névtelen felhasználókat, akkor a FormsAuthenticationModule automatikusan átirányítja a felhasználót a bejelentkezési oldalra.
Kíváncsi lehet arra, hogy miért történik itt átirányítás. Ha a felhasználó ugyanazon az oldalon szeretne maradni, miért van szükség az explicit átirányításra? Ennek az az oka, hogy amikor a "Logoff" LinkButton gombra kattint, a felhasználó továbbra is rendelkezik az űrlap-hitelesítési jegyével a sütik gyűjteményében. Következésképpen a visszavételi kérelem hitelesített kérés. A LoginStatus vezérlő meghívja a SignOut metódust, de ez azután történik, hogy a FormsAuthenticationModule hitelesítette a felhasználót. Ezért egy explicit átirányítás miatt a böngésző újrakérheti a lapot. Mire a böngésző újrakéri az oldalt, az űrlaphitelesítési jegy el lett távolítva, ezért a bejövő kérés névtelen.
- Átirányítás – a rendszer átirányítja a felhasználót a LoginStatus LogoutPageUrl tulajdonsága által megadott URL-címre.
- RedirectToLoginPage – a rendszer átirányítja a felhasználót a bejelentkezési lapra.
Adjunk hozzá egy LoginStatus-vezérlőt a mesterlaphoz, és konfiguráljuk úgy, hogy az Átirányítás beállítással elküldjük a felhasználót egy olyan lapra, amely egy üzenetet jelenít meg, amely megerősíti, hogy kijelentkeztek. Először hozzon létre egy lapot a Logout.aspx nevű gyökérkönyvtárban. Ne felejtse el társítani ezt a lapot a Site.master mesterlappal. Ezután írjon be egy üzenetet a lap korrektúrába, amely elmagyarázza a felhasználónak, hogy ki van jelentkezve.
Ezután térjen vissza a Site.master mesterlapra, és adjon hozzá egy LoginStatus-vezérlőt a LoginView alatt a LoginContent ContentPlaceHolderben. Állítsa a LoginStatus vezérlőelem LogoutAction tulajdonságát átirányításra, a LogoutPageUrl tulajdonságát pedig "~/Logout.aspx" értékre.
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />.
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
<asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br />
<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Mivel a LoginStatus kívül esik a LoginView vezérlőn, a névtelen és hitelesített felhasználók számára is megjelenik, de ez rendben van, mert a LoginStatus helyesen jeleníti meg a "Login" vagy a "Logout" LinkButtont. A LoginStatus vezérlő hozzáadásával a "Log In" HyperLink az AnonymousTemplate-ban felesleges, ezért távolítsa el.
A 18. ábra a Default.aspx oldalt mutatja, amikor Jisun meglátogatja. Vegye figyelembe, hogy a bal oldali oszlopban megjelenik a "Welcome back, Jisun" üzenet, valamint egy kijelentkezésre mutató hivatkozás. A kijelentkezés gombra kattintás postback-et okoz, kijelentkezi Jisunt a rendszerből, majd átirányítja a Logout.aspx oldalra. Ahogy a 19. ábra mutatja, amire Jisun eléri a Logout.aspx oldalt, már kijelentkezett, ezért névtelen. Ennek következtében a bal oldali oszlopban az "Üdvözöljük, idegen" szöveg és a bejelentkezési oldalra mutató hivatkozás látható.
18. ábra: A Default.aspx megjeleníti a "Welcome Back, Jisun" üdvözlőüzenetet és a "Logout" LinkButton elemet (Kattintson ide a teljes méretű kép megtekintéséhez)
19. ábra: Logout.aspx "Üdvözöljük, idegen" feliratot, valamint egy "Bejelentkezés" linkbuttont (kattintson ide a teljes méretű kép megtekintéséhez)
Megjegyzés:
Bátorítom, hogy a Logout.aspx oldalt testre szabja úgy, hogy elrejtse a mesteroldal LoginContent tartalomhelyőrt (ahogy a Login.aspx oldallal tettük a 4. lépésben). Ennek az az oka, hogy a LoginStatus vezérlő által renderelt „Login” LinkButton (az, amelyik a „Hello, stranger” alatt található) a felhasználót a bejelentkezési oldalra irányítja, úgy, hogy az aktuális URL-t a ReturnUrl lekérdezési paraméterben adja át. Röviden, ha egy kijelentkezett felhasználó rákattint ezen a LoginStatuson található "Bejelentkezés" LinkButton-ra, majd bejelentkezik, a rendszer visszairányítja őket a Logout.aspx oldalra, ami könnyen összezavarhatja a felhasználót.
Összefoglalás
Ebben az oktatóanyagban az űrlaphitelesítési munkafolyamat vizsgálatával kezdtük, majd az űrlaphitelesítés implementálására váltottunk egy ASP.NET alkalmazásban. Az űrlaphitelesítést a FormsAuthenticationModule működteti, amelynek két feladata van: a felhasználók azonosítása az űrlaphitelesítési jegyük alapján, valamint a jogosulatlan felhasználók átirányítása a bejelentkezési oldalra.
A .NET-keretrendszer FormsAuthentication osztálya metódusokat tartalmaz az űrlaphitelesítési jegyek létrehozására, vizsgálatára és eltávolítására. A Request.IsAuthenticated tulajdonság és a Felhasználói objektum további programozott támogatást nyújt annak meghatározásához, hogy hitelesítve van-e egy kérés, és hogy a felhasználó identitásával kapcsolatos információk legyenek-e. A LoginView, a LoginStatus és a LoginName webvezérlők segítségével a fejlesztők gyorsan, kódmentesen végezhetik el a bejelentkezéssel kapcsolatos gyakori feladatokat. Ezeket és más bejelentkezéssel kapcsolatos webes vezérlőket részletesebben is megvizsgáljuk a jövőbeli oktatóanyagokban.
Ez az oktatóanyag egy felszínes áttekintést nyújtott a űrlaphitelesítésről. Nem vizsgáltuk meg a válogatott konfigurációs beállításokat, nem vizsgáltuk meg a cookie nélküli űrlaphitelesítési jegyek működését, és nem vizsgáltuk meg, hogy ASP.NET hogyan védi az űrlaphitelesítési jegy tartalmát.
Boldog programozást!
További olvasás
Az oktatóanyagban tárgyalt témakörökről az alábbi forrásokban talál további információt:
- Változások az IIS6 és az IIS7 biztonság között
- Bejelentkezési ASP.NET vezérlők
- Professional ASP.NET 2.0 Security, Membership and Role Management (ISBN: 978-0-7645-9698-8)
-
a
<authentication>elem -
Az
<forms>elem<authentication>számára
Oktatóvideó az oktatóanyagban szereplő témakörökről
Tudnivalók a szerzőről
Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Tanuld meg ASP.NET 2.0 24 óra alatt. Ő itt elérhető mitchell@4GuysFromRolla.com.
Külön köszönet...
Ezt az oktatóanyag-sorozatot sok hasznos véleményező áttekintette. Az oktatóanyag vezető véleményezője volt, ezt az oktatóanyag-sorozatot pedig sok hasznos véleményező áttekintette. Az oktatóanyag vezető véleményezői közé tartozik Alicja Maziarz, John Suru és Teresa Murphy. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.