Při použití forms autentizace, o které jsme již psali, můžeme využít takzvané trvalé přihlášení – systém si uloží potřebné informace o uživateli bezpečně do cookies. Tak můžeme uživateli snadno poskytnout komfort přihlášení a personalizace, jaký znáte například z našeho Interfora, kde se trvalé přihlášení také využívá. V článku dáme uživateli možnost tuto funkci nevyužít a ochránit tak jeho soukromí například v netcafé.

Ačkoli jsme o použití cookies v ASP.NET již psali, v tomto příkladu nám znalosti použití cookies k užitku příliš nebudou – na Intervalu již popsaná forms autentizace totiž disponuje vlastním mechanismem pro trvalé přihlášení. Stačí nastavit potřebné vlastnosti a trvalé přihlášení je funkční, samozřejmě pokud klient podporuje cookies. Možnost volby trvalého přihlášení si můžete vyzkoušet v Interforu. Soubory zde popsaného příkladu si můžete stáhnout (zdrojový kód).

Naše ukázka se bude dosti podobat příkladu popsaném v článku o forms autentizaci, proto jen zopakuji základní prinicip. Forms autentizace využívá zvlášť připravené metody pro forms autentizaci. Tyto řeší zobrazení přihlašovacího formuláře (stránky s formulářem) a automatický návrat (přesměrování) na stránku, na které byl vyvolán požadavek na autentizaci uživatele. Teoreticky tak můžeme libovolnou aplikaci, kterou již používáme s anonymním přístupem, pouhým nastavením ve Web.config a přidáním stránky s přihlašovacím formulářem rozšířit na aplikaci s přístupem po autentizaci. Uživatelské účty a hesla (tzv. credentials) jsou uloženy v konfiguračním souboru aplikace Web.config. Hesla jednotlivých uživatelů jsou v našem případě uložena v čisté podobě, díky nastavení passwordFormat=“Clear“ v elementu credentials. Další možné varianty jsou v podobě otisku MD5 nebo SHA1. Nejsou-li povolené sessions (tzv. session state), autentizace nebude pracovat. Je třeba upozornit, že typ autentizace je možné nastavit jen na nejvyšší úrovně aplikace – tedy v Machine.config nebo ve Web.config v kořeni virtuální aplikace IIS. Potřebujeme-li mít na serveru aplikace přístupné po autentizaci a současně s anonymním přístupem, je třeba vytvořit zvláštní virtuální aplikaci – obojí provoz najednou není možný. Pokud se pokusíme nastavit typ autentizace mimo kořen aplikace (například ve Web.config v podadresáři), dojde k chybě aplikace, jak ukazuje následující obrázek:

Chyba konfigurace
Chyba konfigurace (plná velikost, cca 25 kB)

Pro kompletní zopakování forms autentizace ještě ukázka definice uživatelských účtů ve Web.config:

<configuration>
  <system.web>
    <authentication mode=“Forms“>
      <forms name=“AuthCookie“ loginUrl=“Login.aspx“ protection=“All“ timeout=“30″ path=“/“>
        <credentials passwordFormat=“Clear“>
          <user name=“houba“ password=“autobus“ />
          <user name=“strom“ password=“tramvaj“ />
        </credentials>
      </forms>
    </authentication>
    <authorization> article=1371′ title=’Kopp, Ondřej: Jak zabezpečit aplikace v ASP.NET, 2. díl‘
      <deny users=“?“ />
    </authorization>
  </system.web>
</configuration>

Formulář přihlašovací stránky doplníme o zatrhávací políčko, které bude určovat, zda má být přihlášení trvalé – zda při přesměrování na stránku aplikace metodou RedirectFromLoginPage vytvoří takzvaná persistent cookie. Jenom podotýkám, že uvedená metoda je přetížená, a její druhá podoba umožňuje navíc nastavit i cestu (adresář) platnosti perzistentní cookie.

<%@ Page Language=“C#“ Trace=“False“ Debug=“False“ %>
<%@ Import Namespace=“System.Web.Security“ %>
<script language=“C#“ runat=server>
void Login(Object sender, EventArgs E)
{
  if (FormsAuthentication.Authenticate(txbUser.Text,txbPassword.Text))
  {
    FormsAuthentication.RedirectFromLoginPage(txbUser.Text, chkPersistCookie.Checked);
  }
  else
  {
    lblMsg.Text = „Chybné heslo – zadejte znovu prosím“;
  }
}
</script>
<html>
  <body>
    <form RunAt=“server“>
      <fieldset>
        <legend>Přihlášení<br /></legend>
        Uživatel: <asp:TextBox Id=“txbUser“ RunAt=“server“ />
        <br />
        <asp:RequiredFieldValidator ControlToValidate=“txbUser“ Display=“Dynamic“ ErrorMessage=“Schází uživatelské jméno“ RunAt=“server“ />
        <br />
        <asp:TextBox Id=“txbPassword“ TextMode=“Password“ RunAt=“server“ />
        <br />
        <asp:RequiredFieldValidator ControlToValidate=“txbPassword“ Display=“Dynamic“ ErrorMessage=“Schází heslo“ RunAt=“server“ />
        <br />
        <asp:CheckBox Id=“chkPersistCookie“ RunAt=“server“ Text=“trvalé přihlášení“ />
        <br />
        <asp:button text=“Přihlásit“ OnClick=“Login“ runat=server/>
        <br />
        <asp:Label id=“lblMsg“ ForeColor=“red“ RunAt=“server“ />
      </fieldset>
    </form>
  </body>
</html>

To je celé, zbývající části aplikace se nemusejí pro ovládání trvalého přihlášení nijak upravovat. A jako v předchozím článku bychom měli zbývající stránky aplikace doplnit o možnost odhlášení – importujeme prostor názvů System.Web.Security a přidáme tlačítko pro provedení metody SignOut():

<%@ Page Language=“C#“ Trace=“False“ Debug=“False“ %>
<%@ Import Namespace=“System.Web.Security “ %>
<script language=“C#“ runat=server>
void Page_Load(Object Src, EventArgs E )
{
  lblUser.Text = „Vítej, “ + User.Identity.Name;
}
void Logout(Object sender, EventArgs E)
{
  FormsAuthentication.SignOut();
  Response.Redirect(„Login.aspx“,true);
}
</script>
<html>
  <body>
    <form runat=“server“>
      <asp:Label id=“lblUser“ RunAt=“server“ />
      <br />
      <asp:Button Text=“Odhlásit“ OnClick=“Logout“ RunAt=“server“ />
    </form>
  </body>
</html>

Odhlašovací část by se vyplatilo zapouzdřit do uživatelského ovládacího prvku nebo jinak provedené společné hlavičky či patičky stránky, čímž se nám kód nejen zpřehlední, ale i usnadní pozdější úpravy aplikace nebo přidání dalších stránek.

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

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

Žádný příspěvek v diskuzi

Odpovědět