Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Od doby, kdy byl tento článek napsán, byly poskytovatelé členství ASP.NET nahrazeni ASP.NET Identity. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity místo poskytovatelů členství doporučených v době psaní tohoto článku. ASP.NET Identity má řadu výhod oproti systému členství ASP.NET, včetně:
- Lepší výkon
- Vylepšená rozšiřitelnost a testovatelnost
- Podpora OAuth, OpenID Connect a dvojúrovňového ověřování
- Podpora identit založených na deklaracích
- Lepší interoperabilita s ASP.Net Core
Stáhnout Kód nebo Stáhnout PDF
V tomto kurzu se obrátíme z pouhé diskuse na implementaci; Konkrétně se podíváme na implementaci ověřování pomocí formulářů. Webová aplikace, kterou v tomto kurzu začneme vytvářet, budeme ji dále rozvíjet v dalších kurzech, protože přecházíme z jednoduchého ověřování pomocí formulářů na členství a role.
Další informace o tomto tématu najdete v tomto videu: Použití základního ověřování pomocí formulářů v ASP.NET.
Úvod
V předchozím kurzu jsme probrali různé možnosti ověřování, autorizace a uživatelského účtu, které poskytuje ASP.NET. V tomto kurzu se obrátíme z pouhé diskuse na implementaci; Konkrétně se podíváme na implementaci ověřování pomocí formulářů. Webová aplikace, kterou v tomto kurzu začneme vytvářet, budeme ji dále rozvíjet v dalších kurzech, protože přecházíme z jednoduchého ověřování pomocí formulářů na členství a role.
Tento kurz začíná podrobným pohledem na pracovní postup ověřování formulářů, což je téma, na které jsme se v předchozím kurzu podívali. Dále vytvoříme web ASP.NET, prostřednictvím kterého si ukážeme koncepty ověřování pomocí formulářů. Dále nakonfigurujeme web tak, aby používal ověřování pomocí formulářů, vytvořili jednoduchou přihlašovací stránku a zjistili, jak určit, v kódu, jestli je uživatel ověřený, a pokud ano, uživatelské jméno, se kterým se přihlásil.
Pochopení pracovního postupu ověřování formulářů, jeho povolení ve webové aplikaci a vytvoření přihlašovacích a logff stránek jsou všechny zásadní kroky při vytváření ASP.NET aplikace, která podporuje uživatelské účty a ověřuje uživatele prostřednictvím webové stránky. Z tohoto důvodu - a protože tyto kurzy staví na sobě - doporučuji vám, abyste tento kurz plně propracovali, než přejdete na další, i když už máte zkušenosti s konfigurací ověřování formulářů v minulých projektech.
Principy pracovního postupu ověřování pomocí formulářů
Když modul runtime ASP.NET zpracuje požadavek na prostředek ASP.NET, jako je stránka ASP.NET nebo webová služba ASP.NET, požadavek během životního cyklu vyvolá řadu událostí. Na samém začátku a na samém konci požadavku jsou vyvolány události, které se generují při ověřování a autorizaci požadavku, událost vyvolaná v případě neošetřené výjimky atd. Pokud chcete zobrazit úplný výpis událostí, projděte si události objektu HttpApplication.
Moduly HTTP jsou spravované třídy, jejichž kód se spouští v reakci na konkrétní událost v životním cyklu požadavku. ASP.NET dodáván s řadou modulů HTTP, které provádějí základní úlohy na pozadí. Existují dva integrované moduly HTTP, které jsou pro naši diskuzi zvláště důležité:
-
FormsAuthenticationModule– ověřuje uživatele kontrolou ověřovacího lístku formulářů, který je obvykle obsažen v kolekci souborů cookie uživatele. Pokud není ověřovací lístek formuláře, je uživatel anonymní. -
UrlAuthorizationModule– určuje, zda má aktuální uživatel oprávnění pro přístup k požadované adrese URL. Tento modul určuje autoritu podle autorizačních pravidel zadaných v konfiguračních souborech aplikace. ASP.NET také zahrnujeFileAuthorizationModule, který určuje autoritu konzultací požadovaných seznamů přístupových práv souborů.
Tyto pokusy FormsAuthenticationModule o ověření uživatele probíhají před spuštěním UrlAuthorizationModule (a FileAuthorizationModule). Pokud uživatel, který požadavek provede, nemá oprávnění pro přístup k požadovanému prostředku, modul autorizace požadavek ukončí a vrátí stav HTTP 401 Neautorizováno . Ve scénářích ověřování systému Windows se stav HTTP 401 vrátí do prohlížeče. Tento stavový kód způsobí, že prohlížeč vyzve uživatele k zadání přihlašovacích údajů prostřednictvím modálního dialogového okna. Při ověřování pomocí formulářů se však stav HTTP 401 Neautorizováno nikdy neodesílají do prohlížeče, protože FormsAuthenticationModule zjistí tento stav a upraví ho tak, aby místo toho přesměrovává uživatele na přihlašovací stránku (přes stav přesměrování HTTP 302 ).
Odpovědností přihlašovací stránky je určit, jestli jsou přihlašovací údaje uživatele platné, a pokud ano, vytvořit lístek ověřování pomocí formulářů a přesměrovat uživatele zpět na stránku, kterou se pokusil navštívit. Ověřovací lístek je zahrnut v následných požadavcích na stránky webové stránky, které FormsAuthenticationModule používá k identifikaci uživatele.
Obrázek 1: Pracovní postup ověřování pomocí formulářů
Zapamatování lístku ověřování napříč návštěvami stránek
Po přihlášení musí být lístek ověřování formulářů odeslán zpět na webový server na každém požadavku, aby uživatel zůstal přihlášený při procházení webu. Obvykle toho dosáhnete tak, že do kolekce souborů cookie uživatele umístíte ověřovací lístek. Soubory cookie jsou malé textové soubory, které se nacházejí v počítači uživatele a jsou přenášeny v hlavičce HTTP na každém požadavku na web, který soubor cookie vytvořil. Proto po vytvoření a uložení lístku ověřování pomocí formulářů do souborů cookie prohlížeče odešle každá následná návštěva tohoto webu ověřovací lístek spolu s požadavkem, čímž identifikuje uživatele.
Jedním z aspektů souborů cookie je vypršení platnosti souborů cookie, což je datum a čas, kdy prohlížeč soubor cookie zahodí. Když vyprší platnost souboru cookie ověřování formulářů, uživatel se už nedá ověřit, a proto se stane anonymním. Když uživatel navštíví veřejný terminál, pravděpodobně bude chtít, aby platnost ověřovacího lístku vypršela, když zavře prohlížeč. Při návštěvě z domova ale může stejný uživatel chtít, aby se ověřovací lístek při restartování prohlížeče zapamatoval, aby se nemusel znovu přihlašovat při každém návštěvě webu. Toto rozhodnutí často provádí uživatel ve formě zaškrtávacího políčka Pamatovat si mě na přihlašovací stránce. V kroku 3 se podíváme, jak na přihlašovací stránce implementovat zaškrtávací políčko Pamatovat si mě. Následující kurz podrobně řeší nastavení časového limitu lístku ověřování.
Poznámka:
Je možné, že uživatelský agent použitý k přihlášení k webu nemusí podporovat soubory cookie. V takovém případě může ASP.NET používat ověřovací lístky formulářů bez cookies. V tomto režimu se ověřovací lístek zakóduje do adresy URL. Podíváme se, kdy se používají lístky ověřování bez souborů cookie a jak se vytvářejí a spravují v dalším kurzu.
Rozsah ověřování pomocí formulářů
Spravovaný kód FormsAuthenticationModule je součástí ASP.NET runtime. Před verzí 7 webového serveru Microsoft Internet Information Services (IIS) existovala odlišná bariéra mezi HTTP zpracováním IIS a zpracováním modulu runtime ASP.NET. Stručně řečeno, ve službě IIS 6 a starší se FormsAuthenticationModule spustí pouze v případě, že je požadavek delegovaný ze služby IIS do modulu runtime ASP.NET. Služba IIS ve výchozím nastavení zpracovává statický obsah , jako jsou stránky HTML a soubory CSS a obrázku, a pouze předává požadavky na modul runtime ASP.NET, pokud je požadována stránka s příponou .aspx, .asmx nebo .ashx.
Služba IIS 7 však umožňuje integrované kanály IIS a ASP.NET. Pomocí několika nastavení konfigurace můžete nastavit iis 7 pro vyvolání FormsAuthenticationModule pro všechny požadavky. S IIS 7 navíc můžete definovat autorizační pravidla adresy URL pro soubory libovolného typu. Další informace najdete v tématu Změny mezi zabezpečením služby IIS6 a IIS7, zabezpečením webové platformy a vysvětlením autorizace adresy URL služby IIS7.
Dlouhý příběh krátký, ve verzích starších než IIS 7, můžete k ochraně prostředků zpracovávaných modulem runtime ASP.NET použít pouze ověřování pomocí formulářů. Podobně se pravidla autorizace adres URL použijí jenom na prostředky zpracovávané modulem runtime ASP.NET. Se službou IIS 7 je ale možné integrovat FormsAuthenticationModule a UrlAuthorizationModule do kanálu HTTP služby IIS, čímž tuto funkci rozšíříte na všechny požadavky.
Krok 1: Vytvoření webu ASP.NET pro tuto sérii kurzů
Abychom dosáhli co nejširší cílové skupiny, vytvoříme web ASP.NET, který budeme vytvářet v rámci této série, s bezplatnou verzí sady Visual Studio 2008, Visual Web Developer 2008 od Microsoftu. Implementujeme SqlMembershipProvider úložiště uživatelů v databázi Microsoft SQL Server 2005 Express Edition . Pokud používáte Visual Studio 2005 nebo jinou edici sady Visual Studio 2008 nebo SQL Server, nemějte obavy – kroky budou téměř stejné a všechny jiné než triviální rozdíly budou zdůrazněny.
Poznámka:
Ukázková webová aplikace používaná v každém kurzu je k dispozici jako stažení. Tato aplikace ke stažení byla vytvořena pomocí visual web developeru 2008 cíleného na rozhraní .NET Framework verze 3.5. Vzhledem k tomu, že aplikace je určena pro .NET 3.5, její Web.config soubor obsahuje další prvky konfigurace specifické pro 3.5. Ve zkratce, pokud jste ještě nenainstalovali .NET 3.5 do svého počítače, stahovatelná webová aplikace nebude fungovat, aniž byste nejprve odstranili .NET 3.5 specifický kód z Web.config.
Než budeme moct nakonfigurovat ověřování pomocí formulářů, potřebujeme nejprve ASP.NET web. Začněte vytvořením nového webu založeného na systému souborů ASP.NET. Chcete-li toho dosáhnout, spusťte Visual Web Developer a pak přejděte do nabídky Soubor a zvolte Nový web, zobrazte dialogové okno Nový web. Zvolte šablonu webu ASP.NET, nastavte rozevírací seznam Umístění na Systém souborů, zvolte složku, do které chcete web umístit, a nastavte jazyk na C#. Tím se vytvoří nový web se stránkou Default.aspx ASP.NET, složkou App_Data a souborem Web.config.
Poznámka:
Visual Studio podporuje dva režimy řízení projektů: projekty webů a projekty webových aplikací. Projekty webu nemají soubor projektu, zatímco projekty webových aplikací napodobují architekturu projektu v sadě Visual Studio .NET 2002/2003 – obsahují soubor projektu a kompilují zdrojový kód projektu do jednoho sestavení, které je umístěné ve složce /bin. Visual Studio 2005 původně podporoval pouze projekty webu, i když byl model projektu webové aplikace znovu vyvolána aktualizací Service Pack 1; Visual Studio 2008 nabízí oba modely projektů. Edice Visual Web Developer 2005 a 2008 však podporují pouze projekty webu. Budu používat model projektu webu. Pokud používáte jinou edici než Express a chcete místo toho použít model Projektu webové aplikace, můžete to udělat, ale mějte na paměti, že se mohou vyskytnout určité nesrovnalosti mezi tím, co vidíte na obrazovce, a kroky, které musíte provést, oproti snímkům obrazovky a pokynům uvedeným v těchto kurzech.
Obrázek 2: Vytvoření nového souboru System-Based webu (kliknutím zobrazíte obrázek v plné velikosti)
Přidání stránky předlohy
Dále přidejte na web novou hlavní stránku do kořenového adresáře pod názvem Site.master. Stránky předlohy umožňují vývojáři stránek definovat šablonu pro celý web, kterou lze použít pro ASP.NET stránky. Hlavní výhodou stránek předlohy je, že celkový vzhled webu lze definovat v jednom umístění, což usnadňuje aktualizaci nebo úpravu rozložení webu.
Obrázek 3: Přidání stránky předlohy s názvem Site.master na web (kliknutím zobrazíte obrázek v plné velikosti)
Tady na stránce předlohy definujte rozložení stránky pro celý web. Můžete použít návrhové zobrazení a přidat libovolné rozložení nebo webové ovládací prvky, které potřebujete, nebo můžete kód přidat ručně v zobrazení Zdroj. Rozložení stránky předlohy jsem strukturoval tak, aby napodobovalo rozložení použité v tutoriálové sérii Práce s daty v ASP.NET 2.0 (viz obrázek 4). Stránka předlohy používá kaskádové styly CSS pro pozicování a styly s nastavením definovaným v souboru Style.css (který je součástí souboru ke stažení pro tento kurz). I když z níže uvedených značek nemůžete zjistit, pravidla CSS jsou definována tak, aby byl obsah navigačního <divu> naprosto umístěný tak, aby se zobrazoval vlevo a má pevnou šířku 200 pixelů.
<%@ 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>
Stránka předlohy definuje statické rozložení stránky i oblasti, které lze upravovat ASP.NET stránkami, které používají stránku předlohy. Tyto upravitelné oblasti obsahu jsou označeny ovládacím prvkem ContentPlaceHolder, který lze zobrazit v rámci obsahu <div>. Naše stránka předlohy má jednu ContentPlaceHolder hodnotu (MainContent), ale stránka předlohy může mít více ContentPlaceHolders.
Po zadání výše uvedeného značkování se při přepnutí do návrhového zobrazení zobrazí rozvržení vzorové stránky. Všechny ASP.NET stránky, které používají tuto stránku předlohy, budou mít toto jednotné rozložení s možností určit značky pro danou MainContent oblast.
Obrázek 4: Stránka předlohy při prohlížení v návrhovém zobrazení (kliknutím zobrazíte obrázek v plné velikosti)
Vytváření stránek obsahu
V tuto chvíli máme na našem webu Default.aspx stránku, ale nepoužívá stránku předlohy, kterou jsme právě vytvořili. I když je možné manipulovat s deklarativním kódem webové stránky tak, aby používala stránku předlohy, pokud stránka ještě neobsahuje žádný obsah, je jednodušší stránku jednoduše odstranit a znovu ji přidat do projektu a zadat stránku předlohy, která se má použít. Proto začněte odstraněním Default.aspx z projektu.
V dalším kroku klikněte pravým tlačítkem myši na název projektu v Průzkumníku řešení a zvolte, že chcete přidat nový webový formulář s názvem Default.aspx. Tentokrát zaškrtněte políčko Vybrat stránku předlohy a ze seznamu zvolte stránku předlohy Site.master.
Obrázek 5: Přidání nové Default.aspx stránky Výběr stránky předlohy (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 6: Použití hlavní stránky Site.master
Poznámka:
Pokud používáte model projektu webové aplikace, dialogové okno Přidat novou položku neobsahuje zaškrtávací políčko Vybrat stránku předlohy. Místo toho musíte přidat položku typu "Formulář webového obsahu". Po výběru možnosti Formulář webového obsahu a kliknutí na Přidat se v sadě Visual Studio zobrazí stejné dialogové okno Vybrat předlohu zobrazenou na obrázku 6.
Deklarativní kód nové stránky Default.aspx obsahuje pouze direktivu @Page určující cestu k souboru stránky předlohy a ovládací prvek Content pro mainContent ContentPlaceHolder stránky předlohy.
<%@ 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>
Prozatím ponechte Default.aspx prázdné. Později v tomto kurzu se k němu vrátíme a přidáme obsah.
Poznámka:
Stránka předlohy obsahuje oddíl pro nabídku nebo pro jiné navigační rozhraní. V dalším kurzu vytvoříme takové rozhraní.
Krok 2: Povolení ověřování pomocí formulářů
S vytvořeným webem ASP.NET je naším dalším úkolem povolit ověřování pomocí formulářů. Konfigurace ověřování aplikace je určena prostřednictvím elementu<authentication> v Web.config. Element <authentication> obsahuje jeden pojmenovaný atribut režim, který určuje model ověřování používaný aplikací. Tento atribut může mít jednu z následujících čtyř hodnot:
- Windows – jak je popsáno v předchozím kurzu, když aplikace používá ověřování systému Windows, je zodpovědností webového serveru k ověření návštěvníka, a to se obvykle provádí prostřednictvím základního, digestu nebo integrovaného ověřování systému Windows.
- Formuláře – uživatelé se ověřují prostřednictvím formuláře na webové stránce.
- Passport – uživatelé se ověřují pomocí služby Microsoft Passport Network.
- Žádné – nepoužívá se žádný model ověřování; všichni návštěvníci jsou anonymní.
Ve výchozím nastavení ASP.NET aplikace používají ověřování systému Windows. Pokud chcete změnit typ ověřování na ověřování pomocí formulářů, musíme upravit atribut režimu elementu <authentication> na Formuláře.
Pokud projekt ještě neobsahuje soubor Web.config, přidejte ho teď tak, že v Průzkumníku řešení kliknete pravým tlačítkem myši na název projektu, zvolíte Přidat novou položku a pak přidáte soubor webové konfigurace.
Obrázek 7: Pokud projekt ještě neobsahuje Web.config, přidejte ho teď (kliknutím zobrazíte obrázek v plné velikosti).
Dále vyhledejte <authentication> prvek a aktualizujte ho tak, aby používal ověřování pomocí formulářů. Po této změně by měl kód souboru Web.config vypadat nějak takto:
<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>
Poznámka:
Vzhledem k tomu, že Web.config je soubor XML, je důležité dbát na velikost písmen. Ujistěte se, že jste nastavili atribut režimu na Forms s velkým písmenem "F". Pokud používáte jiné pouzdro, například formuláře, zobrazí se při návštěvě webu prostřednictvím prohlížeče chyba konfigurace.
Prvek <authentication> může volitelně obsahovat <forms> podřízený prvek, který obsahuje nastavení specifické pro ověřování formulářů. Prozatím použijeme výchozí nastavení ověřování pomocí formulářů. V dalším kurzu se podrobněji podíváme na <forms> podřízený prvek.
Krok 3: Sestavení přihlašovací stránky
Pro podporu ověřování formulářů potřebuje naše webové stránky přihlašovací stránku. Jak je popsáno v části "Principy pracovního postupu ověřování formulářů", uživatel se automaticky přesměruje na přihlašovací stránku, FormsAuthenticationModule pokud se pokusí získat přístup k stránce, ke které nemá oprávnění k zobrazení. Existují také ASP.NET webové ovládací prvky, které zobrazí odkaz na přihlašovací stránku anonymním uživatelům. To se týká otázky", "Jaká je adresa URL přihlašovací stránky?".
Ve výchozím nastavení systém ověřování formulářů očekává, že přihlašovací stránka bude pojmenovaná Login.aspx a umístí se do kořenového adresáře webové aplikace. Pokud chcete použít jinou adresu URL přihlašovací stránky, můžete to udělat tak, že ji zadáte v Web.config. V následujícím kurzu se dozvíme, jak to udělat.
Přihlašovací stránka má tři odpovědnosti:
- Zadejte rozhraní, které návštěvníku umožní zadat své přihlašovací údaje.
- Určete, jestli jsou odeslané přihlašovací údaje platné.
- "Přihlaste se" uživatele vytvořením lístku ověřování pomocí formulářů.
Vytvoření uživatelského rozhraní přihlašovací stránky
Pojďme začít s prvním úkolem. Přidejte novou stránku ASP.NET do kořenového adresáře webu s názvem Login.aspx a přidružte ji ke stránce předlohy Site.master.
Obrázek 8: Přidání nové ASP.NET stránky s názvem Login.aspx (kliknutím zobrazíte obrázek v plné velikosti)
Typické rozhraní přihlašovací stránky se skládá ze dvou textových polí – jednoho pro jméno uživatele, jedno pro heslo – a tlačítka pro odeslání formuláře. Weby často obsahují zaškrtávací políčko Pamatovat si mě, že pokud je zaškrtnuté, zachová výsledný lístek ověřování v rámci restartování prohlížeče.
Přidejte dvě textová pole pro Login.aspx a nastavte jejich ID vlastnosti na UserName a Password( v uvedeném pořadí). Vlastnost Heslo TextMode také nastavte na Heslo. Dále přidejte ovládací prvek CheckBox, nastavení jeho ID vlastnosti RememberMe a jeho Text vlastnost na "Remember Me". Za tímto účelem přidejte tlačítko s názvem LoginButton, jehož Text vlastnost je nastavena na "Login". A nakonec přidejte ovládací prvek Label Web a nastavte jeho ID vlastnost na InvalidCredentialsMessage, jeho Text vlastnost na "Vaše uživatelské jméno nebo heslo je neplatné. Zkuste to prosím znovu.", ForeColor jeho vlastnost red a jeho Visible vlastnost false.
V tomto okamžiku by měla obrazovka vypadat podobně jako na obrázku 9 a deklarativní syntaxe stránky by měla vypadat takto:
<%@ 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>
Obrázek 9: Přihlašovací stránka obsahuje dvě textová pole, zaškrtávací políčko, tlačítko a popisek (kliknutím zobrazíte obrázek v plné velikosti).
Nakonec vytvořte obslužnou rutinu události pro událost Click LoginButton. V Návrháři jednoduše poklikejte na tlačítko ovládací prvek vytvořit tuto obslužnou rutinu události.
Určení platnosti zadaných přihlašovacích údajů
Nyní musíme implementovat úlohu 2 v obslužné rutině události Click tlačítka – určení, zda zadané přihlašovací údaje jsou platné. Aby to bylo možné provést, musí existovat úložiště uživatelů, které obsahuje všechny přihlašovací údaje uživatelů, abychom mohli určit, jestli zadané přihlašovací údaje odpovídají všem známým přihlašovacím údajům.
Před ASP.NET 2.0 zodpovídali vývojáři za implementaci jak vlastních úložišť uživatelů, tak za zápis kódu pro ověření zadaných přihlašovacích údajů vůči úložišti. Většina vývojářů implementuje úložiště uživatelů v databázi a vytvoří tabulku s názvem Users se sloupci, jako jsou Uživatelské jméno, Heslo, E-mail, LastLoginDate atd. Tato tabulka by pak měla jeden záznam na uživatelský účet. Ověření zadaných přihlašovacích údajů uživatele by zahrnovalo dotazování databáze na odpovídající uživatelské jméno a následné zajištění, aby heslo v databázi odpovídalo zadanému heslu.
V ASP.NET 2.0 by vývojáři měli ke správě úložiště uživatelů použít jednoho z poskytovatelů členství. V této sérii kurzů budeme používat SqlMembershipProvider, který používá databázi SQL Serveru pro úložiště uživatelů. Při použití SqlMembershipProvider potřebujeme implementovat konkrétní schéma databáze, které zahrnuje tabulky, zobrazení a uložené procedury očekávané poskytovatelem. V kurzu Vytvoření schématu členství v SQL Serveru se podíváme, jak toto schéma implementovat. Při použití zprostředkovatele členství je ověření přihlašovacích údajů uživatele stejně jednoduché jako volání metody ValidateUser(uživatelské jméno, heslo)třídy Členství, která vrátí logickou hodnotu označující platnost kombinace uživatelského jména a hesla. Vidíme, že jsme zatím neimplementovali úložiště uživatelů SqlMembershipProvider, nemůžeme v tuto chvíli použít metodu ValidateUser třídy membership.
Místo toho, abychom si vytvořili vlastní tabulku databáze Users (která by byla po implementaci SqlMembershipProvider zastaralá), místo toho pevně zakódujeme platné přihlašovací údaje na samotné přihlašovací stránce. Do obslužné rutiny události Click LoginButton přidejte následující kód:
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;
}
Jak vidíte, existují tři platné uživatelské účty – Scott, Jisun a Sam – a všechny tři mají stejné heslo ("heslo"). Kód prochází pole uživatelů a hesel, která hledají platnou shodu uživatelského jména a hesla. Pokud jsou uživatelské jméno i heslo platné, musíme uživatele přihlásit a pak ho přesměrovat na příslušnou stránku. Pokud jsou přihlašovací údaje neplatné, zobrazíme popisek InvalidCredentialsMessage.
Když uživatel zadá platné přihlašovací údaje, zmínil jsem, že jsou pak přesměrováni na "příslušnou stránku". Jaká je ale příslušná stránka? Vzpomeňte si, že když uživatel navštíví stránku, ke které nemá oprávnění k zobrazení, model FormsAuthenticationModule je automaticky přesměruje na přihlašovací stránku. Tím se do řetězce dotazu zahrne požadovaná adresa URL prostřednictvím parametru ReturnUrl. To znamená, že pokud se uživatel pokusil navštívit ProtectedPage.aspx a nebyl k tomu autorizovaný, model FormsAuthenticationModule by ho přesměroval na:
Login.aspx? ReturnUrl=ProtectedPage.aspx
Po úspěšném přihlášení by se měl uživatel přesměrovat zpět na ProtectedPage.aspx. Případně můžou uživatelé navštívit přihlašovací stránku na vlastní volbě. V takovém případě by se měl po přihlášení uživatele odeslat na Default.aspx stránku kořenové složky.
Přihlášení uživatele
Za předpokladu, že zadané přihlašovací údaje jsou platné, musíme vytvořit ověřovací lístek formuláře, čímž přihlásíme uživatele k webu. Třída FormsAuthentication v oboru názvů System.Web.Security poskytuje různé metody pro přihlášení a odhlášení uživatelů prostřednictvím ověřovacího systému formulářů. I když ve třídě FormsAuthentication existuje několik metod, tři, které nás v tomto bodě zajímají, jsou:
- GetAuthCookie(uživatelské jméno, persistCookie) – vytvoří lístek ověřování formulářů pro zadané uživatelské jméno. Dále tato metoda vytvoří a vrátí HttpCookie objekt, který obsahuje obsah ověřovacího lístku. Pokud je hodnota persistCookie pravdivá, vytvoří se trvalý soubor cookie.
- SetAuthCookie(uživatelské jméno, persistCookie) – volá metodu GetAuthCookie(username, persistCookie) pro vygenerování ověřovacího souboru cookie formulářů. Tato metoda pak přidá soubor cookie vrácený metodou GetAuthCookie do kolekce Cookies (za předpokladu, že se používá ověřování pomocí formulářů založených na souborech cookie; jinak tato metoda volá interní třídu, která zpracovává logiku lístku bez souborů cookie).
- RedirectFromLoginPage(uživatelské jméno, persistCookie) – tato metoda volá SetAuthCookie(username, persistCookie) a pak přesměruje uživatele na příslušnou stránku.
GetAuthCookie je užitečné, když před napsání souboru cookie do kolekce cookies potřebujete upravit ověřovací lístek. SetAuthCookie je užitečné, pokud chcete vytvořit lístek ověřování formulářů a přidat ho do kolekce souborů cookie, ale nechcete uživatele přesměrovat na příslušnou stránku. Možná je chcete nechat na přihlašovací stránce nebo je poslat na jinou stránku.
Vzhledem k tomu, že se chceme přihlásit uživatele a přesměrovat ho na příslušnou stránku, použijeme RedirectFromLoginPage. Aktualizujte obslužnou rutinu události Click u tlačítka LoginButton a nahraďte dva okomentované řádky TODO následujícím řádkem kódu:
FormsAuthentication.RedirectFromLoginPage(Uživatelské jméno.Text, RememberMe.Zaškrtnuto);
Při vytváření lístku ověřování formulářů používáme vlastnost Text TextBoxu UserName pro parametr uživatelské jméno lístku ověřování formulářů a stav zaškrtnutí CheckBoxu RememberMe pro parametr persistCookie.
Pokud chcete přihlašovací stránku otestovat, navštivte ji v prohlížeči. Začněte zadáním neplatných přihlašovacích údajů, jako je uživatelské jméno "Nope" a heslo "špatné". Po kliknutí na tlačítko Přihlásit se objeví postback a zobrazí se popisek InvalidCredentialsMessage.
Obrázek 10: Popisek InvalidCredentialsMessage se zobrazí při zadávání neplatných přihlašovacích údajů (kliknutím zobrazíte obrázek v plné velikosti).
Dále zadejte platné přihlašovací údaje a klikněte na tlačítko Přihlásit. Tentokrát, když dojde ke zpětnému odeslání, vytvoří se ověřovací lístek formulářů a automaticky se přesměrujete zpět na Default.aspx. V tomto okamžiku jste se přihlásili k webu, i když neexistují žádné vizuální upozornění, které by indikovaly, že jste právě přihlášení. V kroku 4 se dozvíme, jak programově určit, jestli je uživatel přihlášený nebo ne, a jak identifikovat uživatele, který stránku navštíví.
Krok 5 zkoumá techniky odhlášení uživatele z webových stránek.
Zabezpečení přihlašovací stránky
Když uživatel zadá své přihlašovací údaje a odešle formulář přihlašovací stránky, přenesou se přihlašovací údaje (včetně hesla) přes internet na webový server ve formátu prostého textu. To znamená, že jakýkoli hacker šifrující síťový provoz vidí uživatelské jméno a heslo. Abyste tomu zabránili, je nezbytné šifrovat síťový provoz pomocí ssl (Secure Socket Layer). Tím zajistíte, že jsou přihlašovací údaje (i kód HTML celé stránky) zašifrované od okamžiku, kdy opustí prohlížeč, dokud nebudou přijaty webovým serverem.
Pokud váš web neobsahuje citlivé informace, budete potřebovat použít SSL jenom na přihlašovací stránce a na jiných stránkách, kde by se heslo uživatele jinak odeslalo přes internet ve formátu prostého textu. Nemusíte se starat o zabezpečení lístku ověřování formulářů, protože ve výchozím nastavení je šifrovaný i digitálně podepsaný (aby se zabránilo manipulaci). Podrobnější diskuse o zabezpečení ticketu ověřování pomocí formulářů je představena v následujícím kurzu.
Poznámka:
Mnoho finančních a lékařských webů je nakonfigurováno tak, aby používalo PROTOKOL SSL na všech stránkách přístupných ověřeným uživatelům. Pokud vytváříte takový web, můžete nakonfigurovat systém ověřování formulářů tak, aby se lístek ověřování formulářů přenášel pouze přes zabezpečené připojení.
Krok 4: Zjištění ověřených návštěvníků a určení jejich identity
V tuto chvíli jsme povolili ověřování pomocí formulářů a vytvořili základní přihlašovací stránku, ale zatím jsme se museli podívat, jak můžeme zjistit, jestli je uživatel ověřený nebo anonymní. V některých scénářích můžeme chtít zobrazit různá data nebo informace v závislosti na tom, jestli je na stránce navštívený ověřený nebo anonymní uživatel. Kromě toho často potřebujeme znát identitu ověřeného uživatele.
Pojďme rozšířit stávající Default.aspx stránku, abychom tyto techniky ilustroval. V Default.aspx přidejte dva ovládací prvky panelu, jeden s názvem AuthenticatedMessagePanel a jiný s názvem AnonymousMessagePanel. Na prvním panelu přidejte ovládací prvek typu Popisek s názvem WelcomeBackMessage. Na druhém panelu přidejte ovládací prvek HyperLink, nastavte jeho Text vlastnost na "Přihlásit" a jeho NavigateUrl vlastnost "~/Login.aspx". V tomto okamžiku by deklarativní kód pro Default.aspx měl vypadat nějak takto:
<%@ 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>
Jak už jste asi odhadli, nápad zde je zobrazit pouze AuthenticatedMessagePanel pro ověřené návštěvníky a jen AnonymousMessagePanel anonymním návštěvníkům. Abychom toho dosáhli, musíme nastavit viditelné vlastnosti těchto panelů v závislosti na tom, jestli je uživatel přihlášený nebo ne.
Vlastnost Request.IsAuthenticated vrátí logickou hodnotu označující, zda byl požadavek ověřen. Do kódu obslužné rutiny události Page_Load zadejte následující kód:
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;
}
}
S tímto kódem navštivte Default.aspx prostřednictvím prohlížeče. Za předpokladu, že jste se ještě přihlásili, uvidíte odkaz na přihlašovací stránku (viz obrázek 11). Klikněte na tento odkaz a přihlaste se k webu. Jak jsme viděli v kroku 3, po zadání přihlašovacích údajů se vrátíte do Default.aspx, ale tentokrát se na stránce zobrazí zpráva "Vítejte zpět!" (viz obrázek 12).
Obrázek 11: Při anonymní návštěvě se zobrazí odkaz pro přihlášení
Obrázek 12: Ověřeným uživatelům se zobrazuje zpráva "Vítejte zpět!"
Aktuálně přihlášenou identitu uživatele můžeme určit prostřednictvím vlastnosti Userobjektu HttpContext. Objekt HttpContext představuje informace o aktuálním požadavku a je domovem takových běžných ASP.NET objektů, jako je Odpověď, Požadavek a Relace, mimo jiné. Vlastnost User představuje kontext zabezpečení aktuálního požadavku HTTP a implementuje rozhraní IPrincipal.
Vlastnost uživatele je nastavena modulem FormsAuthenticationModule. Konkrétně, když FormsAuthenticationModule najde v příchozím požadavku lístek ověřování prostřednictvím formulářů, vytvoří nový objekt GenericPrincipal a přiřadí ho k vlastnosti User.
Hlavní objekty (například GenericPrincipal) poskytují informace o identitě uživatele a rolích, ke kterým patří. Rozhraní IPrincipal definuje dva členy:
- IsInRole(roleName) – metoda, která vrací logickou hodnotu určující, zda principál patří do zadané role.
- Identity – vlastnost, která vrací objekt, který implementuje rozhraní IIdentity. Rozhraní IIdentity definuje tři vlastnosti: AuthenticationType, IsAuthenticated a Name.
Název aktuálního návštěvníka můžeme určit pomocí následujícího kódu:
string currentUzivatelskeJmeno = User.Identity.Name;
Při použití ověřování pomocí formulářů se vytvoří objekt FormsIdentity pro vlastnost Identity GenericPrincipal. Třída FormsIdentity vždy vrátí řetězec "Forms" pro vlastnost AuthenticationType a hodnotu true pro vlastnost IsAuthenticated. Vlastnost Name vrátí uživatelské jméno zadané při vytváření formulářového ověřovacího lístku. Kromě těchto tří vlastností zahrnuje FormsIdentity přístup k podkladovému ověřovacímu lístku prostřednictvím vlastnosti Ticket. Vlastnost Ticket vrátí objekt typu FormsAuthenticationTicket, který má vlastnosti, jako je Expiration, IsPersistent, IssueDate, Name atd.
Důležité, co si zde vzít, je, že parametr username zadaný v metodách FormsAuthentication.GetAuthCookie(username, persistCookie), FormsAuthentication.SetAuthCookie(username, persistCookie) a FormsAuthentication.RedirectFromLoginPage(username, persistCookie) je stejná hodnota vrácená User.Identity.Name. Kromě toho je lístek ověřování vytvořený těmito metodami k dispozici přetypováním User.Identity do objektu FormsIdentity a následným přístupem k vlastnosti Ticket:
FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;
Pojďme v Default.aspx poskytnout personalizovanější zprávu. Aktualizujte obslužnou rutinu události Page_Load tak, aby vlastnost Text popisku WelcomeBackMessage byla přiřazena řetězec "Vítejte zpět, uživatelské jméno!".
WelcomeBackMessage.Text = "Vítejte zpět; " + User.Identity.Name + "!";
Obrázek 13 ukazuje účinek této úpravy (při přihlašování jako uživatel Scott).
Obrázek 13: Úvodní zpráva obsahuje aktuálně přihlášené jméno uživatele
Použití ovládacích prvků LoginView a LoginName
Zobrazení jiného obsahu ověřeným a anonymním uživatelům je běžným požadavkem; proto se zobrazuje jméno aktuálně přihlášeného uživatele. Z tohoto důvodu ASP.NET obsahuje dva webové ovládací prvky, které poskytují stejné funkce zobrazené na obrázku 13, ale bez nutnosti psát jeden řádek kódu.
LoginView je webový ovládací prvek založený na šabloně, který usnadňuje zobrazení různých dat ověřeným a anonymním uživatelům. LoginView obsahuje dvě předdefinované šablony:
- AnonymousTemplate – všechny revize přidané do této šablony se zobrazí pouze anonymním návštěvníkům.
- LoggedInTemplate – kód této šablony se zobrazuje jenom ověřeným uživatelům.
Pojďme přidat ovládací prvek LoginView na stránku předlohy webu Site.master. Místo přidání pouze ovládacího prvku LoginView, přidáme nejprve nový ContentPlaceHolder ovládací prvek, a poté do této nové ContentPlaceHolder umístíme ovládací prvek LoginView. Odůvodnění tohoto rozhodnutí se brzy zjeví.
Poznámka:
Kromě AnonymousTemplate a LoggedInTemplate může ovládací prvek LoginView obsahovat šablony specifické pro role. Šablony specifické pro role zobrazují značky pouze uživatelům, kteří patří do zadané role. V dalším kurzu prozkoumáme funkce založené na rolích ovládacího prvku LoginView.
Začněte přidáním ContentPlaceHolder s názvem LoginContent na stránku předlohy v rámci elementu div< navigace>. Ovládací prvek ContentPlaceHolder můžete jednoduše přetáhnout z panelu nástrojů do zdrojového zobrazení a umístit výsledný kód přímo nad text "TODO: Menu will go here…".
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Dále přidejte ovládací prvek LoginView v rámci LoginContent ContentPlaceHolder. Obsah umístěný do ovládacích prvků ContentPlaceHolder stránky předlohy se považuje za výchozí obsah pro ContentPlaceHolder. To znamená, že ASP.NET stránky, které používají tuto stránku předlohy, můžou pro každý obsah ContentPlaceHolder zadat vlastní obsah nebo použít výchozí obsah stránky předlohy.
LoginView a další ovládací prvky související s přihlášením se nacházejí na kartě Přihlášení na panelu nástrojů.
Obrázek 14: Ovládací prvek LoginView v sadě nástrojů
Dále přidejte dva <br /> prvky bezprostředně za ovládací prvek LoginView, ale stále uvnitř ContentPlaceHolder. V tomto okamžiku by měl kód prvku navigačního <div> vypadat takto:
<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>
Šablony LoginView lze definovat z návrhového prostředí nebo deklarativního označení. V Návrháři sady Visual Studio rozbalte inteligentní značku LoginView, která obsahuje seznam nakonfigurovaných šablon v rozevíracím seznamu. Zadejte text "Hello, neznámý" do AnonymousTemplate; dále přidejte ovládací prvek HyperLink a nastavte jeho vlastnosti Text a NavigateUrl na "Přihlásit se" a "~/Login.aspx".
Po nakonfigurování AnonymousTemplate přepněte na LoggedInTemplate a zadejte text "Vítejte zpět". Potom přetáhněte ovládací prvek LoginName z panelu nástrojů do loggedInTemplate a umístěte ho hned za text "Vítejte zpět". Ovládací prvek LoginName, jak napovídá jeho název, zobrazuje jméno aktuálně přihlášeného uživatele. Interně ovládací prvek LoginName jednoduše vypíše vlastnost User.Identity.Name.
Po přidání těchto doplňků do šablon LoginView by měl kód vypadat podobně jako následující:
<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>
Když přidáme tuto část na hlavní stránku Site.master, každá stránka na našem webu zobrazí jinou zprávu v závislosti na tom, zda je uživatel autentizovaný. Obrázek 15 ukazuje stránku Default.aspx při návštěvě prohlížeče uživatelem Jisun. Zpráva "Vítejte zpět, Jisun" se opakuje dvakrát: jednou v navigačním oddílu stránky předlohy vlevo (prostřednictvím ovládacího prvku LoginView, který jsme právě přidali) a jednou v oblasti obsahu Default.aspx (prostřednictvím ovládacích prvků panelu a programové logiky).
Obrázek 15: Ovládací prvek LoginView zobrazí "Vítejte zpět, Jisun".
Vzhledem k tomu, že jsme na stránku předlohy přidali LoginView, může se zobrazit na každé stránce na našem webu. Na webových stránkách ale nemusíme tuto zprávu zobrazovat. Jednou z těchto stránek je přihlašovací stránka, protože odkaz na ni sem nepatří. Vzhledem k tomu, že jsme na hlavní stránce umístili ovládací prvek LoginView do objektu ContentPlaceHolder, můžeme toto výchozí označení na stránce obsahu přepsat. Otevřete Login.aspx a přejděte do Návrháře. Vzhledem k tomu, že jsme explicitně nedefinovali ovládací prvek Obsahu v Login.aspx pro LoginContent ContentPlaceHolder na stránce předlohy, přihlašovací stránka zobrazí výchozí kód stránky předlohy pro tento ContentPlaceHolder. V Návrháři je vidět, že LoginContent ContentPlaceHolder zobrazuje výchozí značení (ovládací prvek LoginView).
Obrázek 16: Přihlašovací stránka zobrazuje výchozí obsah stránky předlohy LoginContent ContentPlaceHolder (kliknutím zobrazíte plnohodnotný obrázek).
Chcete-li přepsat výchozí kód pro LoginContent ContentPlaceHolder, jednoduše klikněte pravým tlačítkem na oblast v Návrháři a v místní nabídce zvolte možnost Vytvořit vlastní obsah. (Při použití sady Visual Studio 2008 ContentPlaceHolder obsahuje inteligentní značku, která při výběru nabízí stejnou možnost.) Tím se do kódu stránky přidá nový ovládací prvek Obsahu, který nám umožní definovat vlastní obsah pro tuto stránku. Sem můžete přidat vlastní zprávu, například "Přihlaste se...", ale ponecháme tuto prázdnou hodnotu.
Poznámka:
Ve Visual Studio 2005 vytvoření vlastního obsahu způsobí, že se na stránce ASP.NET vytvoří prázdný ovládací prvek typu obsah. Při vytváření obsahu na míru ve Visual Studio 2008 se zkopíruje výchozí obsah stránky předlohy do nově vytvořeného ovládacího prvku Obsah. Pokud používáte Visual Studio 2008, po vytvoření nového ovládacího prvku Obsah nezapomeňte vymazat obsah zkopírovaný ze stránky předlohy.
Obrázek 17 znázorňuje stránku Login.aspx při návštěvě z prohlížeče po provedení této změny. Všimněte si, že v levém navigačním divu< není žádná zpráva "Hello, cizinče" nebo "Vítejte zpátky, >", jako tomu je při návštěvě Default.aspx.
Obrázek 17: Přihlašovací stránka skrývá značky výchozího zástupce obsahu LoginContent ContentPlaceHolder (kliknutím zobrazíte obrázek v plné velikosti).
Krok 5: Odhlášení
V kroku 3 jsme se podívali na vytvoření přihlašovací stránky pro přihlášení uživatele k webu, ale zatím jsme neviděli, jak uživatele odhlásit. Kromě metod pro přihlašování uživatele poskytuje třída FormsAuthentication také metodu SignOut. Metoda SignOut jednoduše zničí lístek ověřování formulářů, čímž se uživatel odhlásí z webu.
Nabídka odkazu pro odhlášení je tak běžnou funkcí, že ASP.NET zahrnuje ovládací prvek určený speciálně pro odhlášení uživatele. Ovládací prvek LoginStatus zobrazí buď tlačítko "Login", nebo tlačítko "Logout" v závislosti na stavu ověření uživatele. Pro anonymní uživatele se zobrazuje "Login" LinkButton, zatímco ověřeným uživatelům se zobrazuje "Logout" LinkButton. Text odkazu Login a Logout Lze nakonfigurovat prostřednictvím vlastností LoginStatus LoginText a LogoutText.
Kliknutím na hypertextový odkaz "Přihlásit se" způsobí postback, který přesměruje na přihlašovací stránku. Kliknutím na LinkButton Logout způsobí, že LoginStatus ovládací prvek vyvolá FormsAuthentication.SignOff metoda a pak přesměruje uživatele na stránku. Stránka, na kterou je přihlášený uživatel přesměrován, závisí na vlastnosti LogoutAction, kterou lze přiřadit k jedné ze tří následujících hodnot:
- Aktualizovat – výchozí; přesměruje uživatele na stránku, kterou právě navštívili. Pokud stránka, kterou právě navštěvovali, neumožňuje anonymním uživatelům, pak FormsAuthenticationModule automaticky přesměruje uživatele na přihlašovací stránku.
Možná vás zajímá, proč se tady provádí přesměrování. Pokud chce uživatel zůstat na stejné stránce, proč je potřeba explicitní přesměrování? Důvodem je, že když uživatel klikne na tlačítko "Odhlásit se" LinkButton, stále má v kolekci souborů cookie ověřovací lístek formulářů. V důsledku toho je požadavek postback ověřeným požadavkem. Ovládací prvek LoginStatus volá metodu SignOut, ale k tomu dochází po ověření uživatele FormsAuthenticationModule. Explicitní přesměrování proto způsobí, že prohlížeč stránku znovu požádá. V době, kdy prohlížeč znovu požádá o stránku, byl formulářový ověřovací lístek odebrán, a proto je příchozí požadavek anonymní.
- Redirect – uživatel je přesměrován na adresu URL určenou vlastností LogoutPageUrl objektu LoginStatus.
- RedirectToLoginPage – uživatel je přesměrován na přihlašovací stránku.
Pojďme přidat ovládací prvek LoginStatus na stránku předlohy a nakonfigurovat ho tak, aby používal možnost Přesměrování k odeslání uživatele na stránku, která zobrazí zprávu s potvrzením odhlášení. Začněte vytvořením stránky v kořenovém adresáři s názvem Logout.aspx. Nezapomeňte tuto stránku přidružit ke stránce předlohy Site.master. Dále do kódu stránky zadejte zprávu s vysvětlením, že uživatel byl odhlášený.
Dále se vraťte na stránku předlohy Site.master a přidejte ovládací prvek LoginStatus pod LoginView v LoginContent ContentPlaceHolder. Vlastnost LogoutAction ovládacího prvku LoginStatus nastavte na Redirect a jeho vlastnost LogoutPageUrl na ~/Logout.aspx.
<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>
Vzhledem k tomu, že LoginStatus není součástí ovládacího prvku LoginView, zobrazí se pro anonymní i ověřené uživatele, ale to je v pořádku, protože LoginStatus správně zobrazí "Login" nebo "Logout" LinkButton. Při přidání ovládacího prvku LoginStatus je hyperlink "Log In" v AnonymousTemplate nadbytečný, takže ho odeberte.
Obrázek 18 ukazuje Default.aspx při návštěvě Jisuna. Všimněte si, že v levém sloupci se zobrazí zpráva "Vítejte zpátky, Jisun" spolu s odkazem k odhlášení. Kliknutím na LinkButton odhlásit se způsobí postback, odhlásí Jisun ze systému a přesměruje ji na stránku Logout.aspx. Jak ukazuje obrázek 19, Jisun byla již odhlášena v době, kdy dosáhne Logout.aspx, a je proto anonymní. V důsledku toho levý sloupec zobrazuje text "Vítejte, cizí" a odkaz na přihlašovací stránku.
Obrázek 18: Default.aspx zobrazuje "Vítejte zpět, Jisun" spolu s odkazem "Odhlásit se" (kliknutím zobrazíte obrázek s plnou velikostí)
Obrázek 19: Logout.aspx zobrazuje "Vítejte, cizí" Spolu s "Login" LinkButton (Kliknutím zobrazíte obrázek v plné velikosti)
Poznámka:
Doporučuji, abyste přizpůsobili Logout.aspx stránku tak, aby skryla loginContent ContentPlaceHolder stránky předlohy (jako jsme to udělali pro Login.aspx v kroku 4). Důvodem je, že "Login" LinkButton vykreslený ovládacím prvkem LoginStatus (pod "Hello, neznámý") přesměruje uživatele na přihlašovací stránku a předá aktuální adresu URL v parametru ReturnUrl dotazovacího řetězce. Stručně řečeno, pokud uživatel, který se odhlásil, klikne na "Login" LinkButton tohoto LoginStatus a pak se přihlásí, bude přesměrován zpět na Logout.aspx, což by mohlo snadno zmást uživatele.
Shrnutí
V tomto kurzu jsme začali prozkoumáním pracovního postupu ověřování formulářů a pak jsme se obrátili na implementaci ověřování formulářů v aplikaci ASP.NET. Ověřování pomocí formulářů využívá Model FormsAuthenticationModule, který má dvě odpovědnosti: identifikaci uživatelů na základě lístku ověřování formulářů a přesměrování neoprávněných uživatelů na přihlašovací stránku.
Třída FormsAuthentication v rámci .NET Framework obsahuje metody pro vytváření, kontrolu a odebírání autentizačních lístků. Vlastnost Request.IsAuthenticated a Objekt uživatele poskytují další programovou podporu pro určení, zda je žádost ověřena, a informace o identitě uživatele. K dispozici jsou také ovládací prvky LoginView, LoginStatus a LoginName Web, které vývojářům poskytují rychlý způsob bez kódu pro provádění mnoha běžných úloh souvisejících s přihlášením. V budoucích kurzech prozkoumáme tyto a další webové ovládací prvky související s přihlášením.
Tento kurz poskytl kurzorový přehled ověřování pomocí formulářů. Nezkoumali jsme různé konfigurace, jak fungují lístky ověřování formulářů bez souborů cookie, ani jak ASP.NET chrání obsah těchto lístků.
Šťastné programování!
Další čtení
Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:
- Změny mezi zabezpečením služby IIS6 a IIS7
- Ovládací prvky pro přihlášení v ASP.NET
- Profesionální ASP.NET 2.0 Zabezpečení, členství a správa rolí (ISBN: 978-0-7645-9698-8)
-
<authentication>elementu -
Element
<forms>pro<authentication>
Školicí video o tématech obsažených v tomto kurzu
O autorovi
Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams: Nauč se ASP.NET 2.0 za 24 hodin. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .
Zvláštní díky...
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavní kontrolor pro tento kurz byl Tento kurz série byl zkontrolován mnoha užitečnými recenzenty. Vedoucí recenzenti tohoto kurzu zahrnují Alicja Maziarz, John Suru a Teresa Murphy. Chcete si projít nadcházející články MSDN? Pokud ano, napište mi zprávu na mitchell@4GuysFromRolla.com.