22.01.2007 | Radek | | Programujeme | Žádné komentáře | 

Jak zabezpečit ASP.NET aplikaci

Mnoho webových aplikací nevyžaduje od uživatele žádné prokázání své identity. V takovém případě se jedná o tzv. anonymní přístup ke všem stránkám takovéto aplikace. Existují ale aplikace, které mají tzv. privátní zónu s jestliže chce uživatel přistupovat i k informacím v této privátní zóně, musí nějakým způsobem prokázat, že se jedná o uživatele oprávněného tyto informace získat. A v tuto chvíli vstupuje do hry proces nazývaný autorizace a autentizace. Nejdříve se vysvětlíme, co tyto dva pojmy znamenají:

Autentizace (Authentication)

Toto na první pohled tajemné slovo znamená vlastně proces, který slouží ke zjištění a ověření identity uživatele. Uživatel musí nějakým způsobem dokázat, že má oprávnění přistupovat do zabezpečení části aplikace a to pomocí uživatelského jména a hesla. Výsledkem je umožnění popřípadě zamítnutí přístupu k zabezpečené části aplikace.

Autorizace (Authorization)

Při autorizaci dochází k ověření, zda autentizovaný uživatel má oprávnění k přístupu k informacím, které požaduje. Pokud je ověření kladné, je mu přístup k těmto informacím povolen, v opačném případě zamítnut.

V .NETu můžete pro autentizaci použít 4 různé režimy a to None, Windows, Forms, Passport. To, jaký režim se použije se řídí podle nastavení v souboru web.config. Je jasné, že při režimu None k žádné autentizaci nedochází. Při režimu Windows provádí autentizaci přímo server IIS a používá se ho většinou v sítích typu intranet, kde lze snadno nastavovat oprávnění přímo v IIS. Při použití režimu Passport provádí ověření identity služba MS Passport, čehož se využívá pouze zřídka. Nejčastěji používaným režimem při tvorbě webových aplikací je režim Forms. Při tomto režimu máte při tvorbě autentizace volné ruce a je jen na vás, proti jakému zdroji dat provedete ověření uživatele. Data o uživatelích můžete mít uložena např. v databázi MS SQL Server nebo v souboru web.config. Jaké úložiště použijete záleží opravdu jen na vás. My si v tomto článku ukážeme, jak provádět autentizaci proti datům uloženým v souboru web.config.

Soubor web.config se nachází v kořenovém adresáři ASP.NET aplikace a mimo to, že slouží např. k nastavování konfiguračních parametrů, jako je řetězec sloužící k připojení na databázi apod., může sloužit také k uložení informací o uživatelích, sloužících k autentizaci. Nejprve je nutno vytvořit sekci authentication a jelikož budeme používat režim Forms, také vnořenou sekci forms.

<authentication mode="Forms">
  <forms name=".ASPXAUTH" loginUrl="Login.aspx"
       defaultUrl="Admin/Default.aspx" timeout=“30“>
     <credentials passwordFormat="Clear">
       <user name="jmeno" password="heslo" />
     </credentials>
  </forms>
</authentication>

Je zde použito několik parametrů. První parametr name slouží k zadání jména tzv. autentizační cookie. Pokud se vynechá, je použito výchozí hodnoty .ASPXAUTH. Pokud tento parametr použijete, doporučuji zadávat nějaká složitější a delší jména, aby nedošlo ke kolizi s autentizační cookie jiné webové aplikace, která by používala stejné jméno. Parametr loginUrl určuje adresu, na kterou bude uživatel přesměrován, pokud není autentizován. V parametru defaultUrl se uvádí adresa, na kterou bude uživatel přesměrován po úspěšné autentizaci. A konečně parametr timeout určuje v minutách dobu, po kterou je autentizace platná. Po vypršení této doby se odstraní autentizační cookie a musíte se znovu přihlásit.

Pro uložení uživatelského jména a hesla je použito sekce credentials. Zde použitý parametr passwordFormat slouží ke zvolení způsobu, v jakém tvaru bude uloženo heslo. Možnosti jsou Clear – čistá textová forma hesla, SHA1 a MD5 – heslo je uloženo v zašifrovaném tvaru pomocí jednoho z těchto dvou algoritmů. Je jen na vás, který z nich si zvolíte. Samotná uživatelská jména a hesla se zapisují do sekce user, kde v parametru name se uvede uživatelské jméno a v parametru password analogicky uživatelovo heslo.

No a nakonec musíme soubor web.config doplnit o sekci authorization, ve které zakážeme přístup neautorizovaným uživatelům. Dejme tomu, že jsme si v rootu aplikace vytvořili složku Admin, do které má mít přístup pouze omezený počet uživatelů. Toto omezení učiníme následovně:

<location path="Admin">
  <system.web>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>
</location>

Naší další prací bude vytvoření přihlašovacího formuláře Login.aspx

<!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 runat="server">
  <title>Přihlášení</title>
</head>

<body>
 <form runat="server">
  <asp:ValidationSummary ID="ValidationSummary1" 
  runat="server" ForeColor="#ff0000" DisplayMode="List"
  Visible="true" ShowSummary="true" />
  <asp:Label ID="ZpravaUzivateli" runat="server">
  Zadejte prosím své  uživatelské jméno a heslo:
  </asp:Label>        
 <table>
  <tr>
   <td><b>Jméno:</b></td>
   <td><asp:TextBox ID="Jmeno" runat="server" /></td>
   <td><asp:RequiredFieldValidator
      ID="RequiredFieldValidator1" runat="server"
      Display="Dynamic" ControlToValidate="Jmeno"
     ErrorMessage="Nebylo zadáno uživatelské jméno!"  
     Visible="true">*</asp:RequiredFieldValidator></td>
 </tr>
 <tr>
  <td><b>Heslo:</b></td>
  <td>
 <asp:TextBox ID="Heslo" runat="server"
   TextMode="Password" /></td>
   <td><asp:RequiredFieldValidator 
    ID="RequiredFieldValidator2" runat="server"      
    Display="Dynamic" ControlToValidate="Heslo" 
    ErrorMessage="Nebylo zadáno heslo!">*</ 
   asp:RequiredFieldValidator></td>
 </tr>
 <tr>
  <td colspan="3"><asp:Button ID="Odeslat" runat="server"
   Text="Přihlásit"></asp:Button></td>
   </tr>
  </table>
 </form>
</body>
</html>

A nakonec také musíme ošetřit událost po kliknutí na tlačítko Přihlásit

Private Sub Odeslat_Click(ByVal sender As Object,ByVal e As
                           EventArgs) Handles Odeslat.Click
   If FormsAuthentication.Authenticate(Me.Jmeno.Text,
                                        Me.Heslo.Text) Then
     FormsAuthentication.RedirectFromLoginPage
                                      (Me.Jmeno.Text,false)
  Else
    Me.ZpravaUzivateli.Text = "Chybné jméno nebo heslo!“
  End If
End Sub

V tomto případě je použito metody RedirectFromLoginPage() z namaspace System.Web.Security, Tato metoda má dva parametry. První z nich je Uživatelské jméno autentizovaného uživatele, druhý udává, zda bude cookie tzv. persistentní či nikoliv. Pokud zadáme jako hodnotu tohoto parametru true, bude cookie platit stále, dokonce i po ukončení prohlížeče a to až do řádného odhlášení pomocí metody FormsAuthentication.SignOut() z namaspace System.Web.Security. Pokud bude mít hodnotu false, cookie bude platná po dobu nastavenou v souboru web.config v parametru timeout nebo do ukončení prohlížeče.

V tomto stavu by vám již měla autentizace i autorizace spolehlivě fungovat. V některém z dalších článků se jistě k zabezpečení ASP.NET aplikací ještě vrátíme, jelikož toto téma obsahuje mnoho zajímavých a užitečných věcí





Napsat komentář

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


Novinky a oznámení

15.10.2016 - Do menu byla přidána nová sekce Stream, kde naleznete jak veškěré informace ohledně Fantomasmag TV, což jsou online streamy na Twitch.tv, tak i přímo online stream a chat.

Partnerské weby

Statistika

Naši fanoušci na Facebooku

Další...