Jak zabezpečit aplikaci v ASP.NET – autentizace pomocí formuláře

30. července 2002

V minulém díle seriálu o bezpečnosti v ASP.NET jste se dozvěděli, že ASP.NET podporuje čtyři základní režimy autentizace uživatelů. Dnes vám podrobně popíši režim autentizace pomocí formuláře, který budete s velkou pravděpodobností používat na svých stránkách nejčastěji.

Jak jsem již naznačil v minulém díle seriálu, nastavení způsobu autentizace se provede v souboru web.config, který se nachází v kořenovém adresáři aplikace. Dále může být tento soubor umístěn ve vnořených podadresářích a v tomto případě se provedené volby týkají adresáře (a podadresářů v něm vnořených), ve kterém je konfigurační soubor umístěn. Pro konfiguraci režimu autentizace Form je třeba nastavit několik údajů právě v souboru web.config, vytvořit formulář pro přihlašování a vytvořit kód pro jeho zpracování. Veškeré ukázky obslužného kódu budou napsány v jazyce C#, ale zcela určitě vám nebude činit větší potíže přepsat kód do jakéhokoli jiného jazyka.

Pro základní nastavení autentizace v režimu Form je třeba provést několik nastavení v souboru web.config. Jedná se o sekci authentication, jejíž význam byl popisován v článku Jak zabezpečit aplikaci v ASP.NET, a o vnořenou sekci Forms, jejíž popis bude následovat.

<authentication mode=“Forms“>
   <forms name=“name“
      loginUrl=“url“
      protection=“All|None|Encryption|Validation“
      timeout=“čas v minutach“
      path=“/“ >
   </forms>
</authentication>

Parametr name určuje jméno „autentizačního cookie“, pokud je tento parametr vynechán ,je použito implicitní jméno .ASPXAUTH. Pokud běží na jednom serveru více web aplikací, je nutné v souboru web.config zajistit, aby použitá jména byla unikátní. Do jistých potíží se tak můžete dostat v případě umístění vašich stránek na webhostingu, kdy je jistá šance, že se „trefíte“ do jména, které použil už někdo jiný. Je to sice nepříjemná situace, ale jediné, co vám mohu doporučit, je volit dostatečně složitá jména.

Parametr loginUrl určuje adresu, na kterou bude návštěvník přesměrován v případě, že není přihlášen (neexistuje autentizační cookie). Standardní hodnota je default.aspx.

Parametr protection určuje způsob ochrany autentizačního cookies. Standardní a současně doporučená hodnota tohoto parametru je All.

V parametru timeout je možné specifikovat čas v minutách, po který je autentizace platná. Standardní hodnota je 30 sekund. Pokud však použijete při přihlášení tzv. perzistentní cookies, je tento parametr ignorován.

A konečně parametr path určuje cestu v aplikaci, pro kterou je autentizační cookie platné. Standardní hodnota je „/“ (slash). Pokud budete specifikovat nějakou další cestu, mějte na paměti, že je třeba cestu zapisovat case-sensitive.

Nechce-li se vám editovat soubor web.config ručně, a zápasit s malými a velkými písmeny, můžete pro editaci použít Hunter Stone Web.Config Editor, o kterém jsme psali v článku Editor konfiguračních souboru .NET.

Při přihlašování pomocí formuláře existuje mnoho způsobů, jak ověřit identitu uživatele. Seznámím vás se třemi způsoby, které považuji za nejčastěji používané.

  1. ověření proti souboru web.config
  2. ověření proti souboru XML
  3. ověření proti SQL databázi

Jistě najdete několik dalších způsobů, jak ověřit uživatele proti čemukoli. Postup je vždy naprosto shodný, stačí zpracovat údaje z formuláře, ověřit jejich pravdivost na místě, kde máme uloženy informace o uživatelích, a v kladném případě dát ASP.NETu na vědomí, že je uživatel přihlášen. Dnes se budeme věnovat ověření proti souboru web.config.

Přihlašovací formulář

Pro přihlášení pomocí formuláře je nutné si tento formulář nejprve vytvořit. Formulář bude obsahovat políčko pro zadání jména a hesla a tlačítko pro odeslaní formuláře. Uživateli však zůstane skryto několik dalších prvků a to sice validátory, které nedovolí odeslat formulář bez vyplnění, a také text, který se zobrazí při neúspěšném přihlášení. Formulář uložíme do souboru login.aspx a kód pro jeho zpracovaní bude uložen v souboru login.aspx.cs.

Vzhled formuláře můžete vytvořit například ve vývojovém prostředí Microsoft ASP.NET Web Matrix, o kterém jsme psali v článku WEB MATRIX Vývojové prostředí pro ASP.NET a které je zdarma. Já osobně jsem jej vytvořil v komerčním vývojovém prostředí Visual Studio.NET, které však může být pro některé z vás nedostupné. Formulář může vypadat například takto:

Formulář obsahuje dvě textová pole pro zadání jména a hesla. K těmto dvěma textovým polím jsou přiřazeny validátory, které znemožní odeslání formuláře bez vyplnění obou položek. Podrobně si o validátorech můžete přečíst v článku ASP.NET – schvalovací prvky.

Zdrojový kód formuláře – login.aspx:

<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“ >
<html>
<head>
   <title>login</title>
   <meta content=“Microsoft Visual Studio 7.0″ name=“GENERATOR“ />
   <meta content=“C#“ name=“CODE_LANGUAGE“ />
   <meta content=“JavaScript“ name=“vs_defaultClientScript“ />
   <meta content=“http://schemas.microsoft.com/intellisense/ie5″ name=“vs_targetSchema“ />
</head>
<body bgcolor=“#eaf4ff“>
   <hr color=“#006600″ size=“2″ />
   <asp:Label id=“Label3″ runat=“server“ Height=“15px“ Width=“137px“ Font-Bold=“True“ ForeColor=“#FF8080″>Přihlašovací fomulář</asp:Label>
   <form id=“login“ method=“post“ runat=“server“>
      <asp:Label id=“Label1″ runat=“server“ Height=“24px“ Width=“56″ Font-Size=“13pt“ Font-Bold=“True“>Jméno:</asp:Label>
      <asp:TextBox id=“strJmeno“ runat=“server“ Height=“24″ Width=“156″></asp:TextBox>
      <asp:RequiredFieldValidator id=“RequiredFieldValidator1″ runat=“server“ ControlToValidate=“strJmeno“ ErrorMessage=“Jméno je třeba vyplnit“></asp:RequiredFieldValidator>
      <br />
      <asp:Label id=“Label2″ runat=“server“ Height=“24px“ Width=“56px“ Font-Size=“13pt“ Font-Bold=“True“>Heslo:</asp:Label>
      <asp:TextBox id=“strHeslo“ runat=“server“ Height=“24px“ Width=“156px“ TextMode=“Password“></asp:TextBox>
      <asp:RequiredFieldValidator id=“RequiredFieldValidator2″ runat=“server“ ControlToValidate=“strHeslo“ ErrorMessage=“Heslo je třeba vyplnit“></asp:RequiredFieldValidator>
      <br />
      <asp:Button id=“prihlasit“ runat=“server“ Font-Bold=“True“ ForeColor=“Green“ BackColor=“#FFFFC0″ Text=“Přihlásit“></asp:Button>
   </form>
   <hr color=“#006600″ size=“2″ />
</body>
</html>

Ošetření události po kliknutí na tlačítko přihlásit:


private void prihlasit_Click(object sender, System.EventArgs e)
{
   if (FormsAuthentication.Authenticate(strJmeno.Text,strHeslo.Text))
   {
      FormsAuthentication.RedirectFromLoginPage(strJmeno.Text, true);
   }
}

Formulář bude pro všechny tři popisované způsoby ověření identický a měnit se bude pouze část, ve které dochází k ověřování správnosti zadaných údajů (autentizaci).

Obsluha událostí z formuláře

Jedinou událostí, kterou budeme muset pro správnou činnost obsloužit, je kliknutí na tlačítko Přihlásit. Způsob, kterým tuto událost obsloužíme, bude záviset na místě uložení údajů o uživateli. V konečném důsledku však musíme po ověření dát ověřovacímu stroji ASP.NET na vědomí, že uživatel je ověřen. Pro toto oznámení použijme metodu SetAuthCookie nebo RedirectFromLoginPage ze třídy FormsAuthentication, která je umístěna ve jmenném prostoru System.Web.Security. Obě metody fungují naprosto stejně, ale metoda RedirectFromLoginPage umí navíc přesměrovat uživatele zpět na stánku, na kterou uživatel chtěl přistoupit předtím, než byl donucen k autentizaci.

public static void SetAuthCookie(
   string userName,
   bool createPersistentCookie
);
public static void RedirectFromLoginPage(
   string userName,
   bool createPersistentCookie
);

Metody mají dva parametry. Do parametru userName se uvádí uživatelské jméno autorizovaného uživatele. Podle toho, jakou hodnotu předáme v parametru createPersistentCookie, bude cookies persistentní či nikoli.

Pokud bude parametr nabývat hodnoty false, bude cookie platné po dobu nastavenou v souboru web.config. Pokud dojde k ukončení prohlížeče, bude autentizační cookie ostraněno.

Jestliže použijete hodnotu true, bude vytvořeno cookie, které bude platné stále, a to dokonce i při restartu prohlížeče. Jediný způsob, jak tento typ autentizačního cookies odstranit, je provést odhlášení způsobem, který je popsán níže.

Pokud budete chtít umožnit uživateli odhlášení, je třeba zajistit vykonání metody SignOut ze třídy FormsAuthentication ve jmenném prostoru System.Web.Security. Metoda nemá žádné parametry a způsobí odstranění autentizačního cookie:

public static void SignOut();

Ověření v souboru web.config

Při ověřování proti souboru web.config se uživatelská jména a hesla ukládají do sekce credentials, která je vnořena v sekci forms.

<credentials passwordFormat=“Clear|SHA1|MD5″>
   <user name=“username“ password=“password“ />
</credentials>

Pomocí parametru passwordFormat zvolíte způsob zašifrování uloženého hesla. Při použití hodnoty Clear nejsou hesla nijak šifrována. Pokud však použijete parametr SHA1 či MD5, bude použit příslušný šifrovací algoritmus. Podrobný popis těchto algoritmů najdete například v MSDN Library.

Uživatelská jména a hesla se ukládají do sekce user, kde se v parametru name uvede přihlašovací jméno uživatele a v parametru password jeho heslo.

Pokud v této fázi zkusíte přistoupit na jakoukoli stránku aplikace, zjistíte, že se bez problémů dostanete kamkoli, a to bez zobrazení přihlašovacího formuláře. Je to proto, že je stále povolen přístup ke stránkám aplikace všem uživatelům a anonymní uživatel tedy může k požadované stránce přistoupit. Aby autentizace začala skutečně fungovat, je třeba do souboru web.config doplnit sekci authorization, ve které zakážete přístup anonymnímu uživateli.

<authorization>
   <deny users=“?“ />
</authorization>

Sekce authorization, která je vnořena do sekce systém.web, umožňuje řídit práva uživatelů a dokonce omezovat i protokoly, které může daný uživatel použít. Lze tak snadno a jednoduše například zakázat uživateli poslat na server data (metoda POST), ale současně mu umožnit data ze serveru získat.

Pro úplnost a přehlednost zde uvedu příklad souboru web.config, který je použit v ukázkovém příkladu:

<?xml version=“1.0″ encoding=“utf-8″?>
<configuration>
   <system.web>
      <authentication mode=“Forms“>
      <forms name=“.Interval_clanek“
      loginUrl=“login.aspx“
      protection=“All“
      timeout=“30″
      path=“/“>
      <credentials passwordFormat=“Clear“>
         <user name=“oko“ password=“ok“ />
      </credentials>
      </forms>
      </authentication>
      <authorization>
         <deny users=“?“ />
      </authorization>
   </system.web>
</configuration>

Pokud vás teď trápí problém jak získat zašifrovaná hesla algoritmem SHA1 či MD5, mám tu pro vás jednoduché řešení. Na adrese http://aspx1.podklady/1999-2008.interval.cz/kopp/hash/ najdete online aplikaci, která zadaný text zašifruje příslušnými algoritmy a vrátí jej zpět ve formuláři.

Samozřejmě jsem nezapomněl na možnost stažení dnešních zdrojových kódů přihlašovacího formuláře. A na co se můžete těšit v dalším díle? Jak jsem naznačil již v úvodu článku, bude to ověření identity uživatele proti XML souboru.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek Karel-Kopal
Další článek Naučte se Javu - výjimky
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *