ASP.NET i Web Matrix – część 4

Transkrypt

ASP.NET i Web Matrix – część 4
Złożone aplikacje ASP.NET
4. Zintegrowane mechanizmy bezpieczeństwa ASP.NET
W ASP.NET zintegrowane mechanizmy bezpieczeństwa oparte są głównie (choć nie tylko)
na plikach konfiguracyjnych web.config i machine.config. Ich pełny opis nie mieści się
w ramach naszego kursu, choć w module 6 zostaną opisane najbardziej interesujące
elementy z punktu widzenia konfiguracji i programowania aplikacji ASP.NET. Plik
web.config jest plikiem typu XML, konfigurowanym (jak na razie) ręcznie przez
programistę aplikacji. Plik ten składa się z wielu sekcji, odpowiedzialnych za poszczególne
elementy konfiguracji aplikacji.
Każda aplikacja ASP.NET jest w stanie odczytać i dostosować swoją pracę w zależności od
wartości parametrów umieszczonych w pliku web.config.
Sekcja <appSettings> pozwala na przechowywanie dowolnej liczby par kluczy
i odpowiadającym im wartości, w celu ich późniejszego odczytania w pliku .aspx lub .cs,
przy pomocy wywołania ConfigurationSettings.AppSettings["nazwaKlucza"]
(przykład 9). W naszej aplikacji w tej sekcji umieszczona będzie pełna ścieżka do bazy
danych wraz z nazwami odpowiednich parametrów określających rodzaj sterowników
pozwalających na odczyt danych.
Przykład 9. Wybrane sekcje w pliku web.config
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
"ConfigurationSettings.AppSettings(key)" method: -->
<appSettings>
<add key="connectionstring" value="Provider=Microsoft.Jet.OLEDB.4.0;
Ole DB Services=-4; Data Source=C:\ASP.NET\MojBank\dane\bank.mdb"/>
</appSettings>
. . .
Podsekcja <add> pozwala dodawać kolejne pary typu klucz–wartość. Parametr key
definiuje nazwę klucza (używanego później w kodzie aplikacji), a parametr value określa
jego wartość. Wartości wszystkich parametrów tej podsekcji muszą być ujęte w nawiasy
— jest to wymóg XML. Sekcja <location> pozwala na określenie praw dostępu
(autoryzacji) użytkowników aplikacji do wybranych plików i katalogów aplikacji na
serwerze (przykład 10). Wynika to z tego, że nie wszyscy użytkownicy aplikacji musza
mieć jednakowy dostęp do wszystkich zasobów. Zastosowanie wielu sekcji <location>
1
Złożone aplikacje ASP.NET
daje administratorowi aplikacji możliwość szybkiego i elastycznego określenia nie tylko
pojedynczych użytkowników, ale całych ich grup w dostępie do zasobów serwera.
Wewnątrz podsekcji <deny> podajemy nazwy użytkowników, którym zabroniony jest
dostęp danego zasobu. Parametr users określa użytkowników aplikacji. Symbol gwiazdki
(*) oznacza wszystkich użytkowników, a znak zapytania (?) użytkowników anonimowych,
niezalogowanych. Zamiast users może również pojawić się parametr roles — będzie on
użyty w module 6.
Przykład 10. Określenie dostępu do wybranych plików i katalogów aplikacji na serwerze w pliku
web.config
. . .
<location path="Header.txt">
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="Footer.txt">
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="temp">
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
</configuration>
Zapis <deny users="*" /> oznacza brak bezpośredniego dostępu do elementu o podanej
ścieżce dla każdego użytkownika aplikacji. Jak widać, będą tak zabezpieczone pliki
Header.txt, Footer.txt oraz katalog temp.
2
Złożone aplikacje ASP.NET
5. Interfejs witryny bankowej
Spójny wygląd wszystkich stron składających się na witrynę internetową jest podstawą
każdej udanej aplikacji. Sposobów na uzyskanie tego celu jest kilka i przyjrzymy się im
już niebawem. Jednak podstawowym elementem jest zaprojektowanie ogólnego układu
stron witryny. I od tego zaczniemy.
5.1. Tworzenie szablonu układu strony
Aby ułatwić pracę i przyspieszyć tworzenie zamierzonego rozwiązania, bazowy szkielet
strony został już przygotowany. Znajduje się on w katalogu MojBank, w materiałach na
płycie. W katalogu ascx znajduje się kontrolka menu, która będzie później modyfikowana
— zależnie od roli zalogowanego użytkownika będzie ona dynamicznie wyświetlać tylko
opcje dla niego dostępne. W katalogu style znajduje się plik bank.css, zawierający
definicje arkusza stylów CSS (ang. Cascading Style Sheet). Będzie on użyty, aby
w prosty sposób wzbogacić wygląd strony, równocześnie centralizując zmiany, np. jej
kolorystyki. Katalog temp jest na razie pusty — docelowo znajdą się tam pliki
pomocnicze, które nie będą dostępne dla zwykłych użytkowników. Natomiast w katalogu
głównym projektu znajduje się plik Layout.aspx. Jest to plik, który stanowi punkt wyjścia
do stworzenia witryny bankowej.
Przyjrzyjmy się zatem budowie strony z pliku Layout.aspx. Jest to tabela szeroka na całą
stronę, w której umieszczone są główne komórki: nagłówek, menu nawigacyjne, treść
strony, pomocniczy status, stopka.
3
Złożone aplikacje ASP.NET
Rysunek 2. Wygląd początkowy aplikacji
Warto zauważyć, jakie rozwiązania są zastosowane w budowie tej strony. Przede
wszystkim każda komórka ma określoną klasę (właściwość class komórek <TD>). Klasy te
zdefiniowane są w arkuszu stylów bank.css. Włączając do strony arkusz stylów (o czym
już niebawem) spowodujemy, że strona od razu „nabierze rumieńców”.
Tabela główna ma szerokość (właściwość width) równą 100%, dzięki czemu dopasowuje
się automatycznie do rozmiaru okna przeglądarki. Dodatkowo ma na razie włączoną
ramkę (właściwość border równą 1), dzięki czemu w przeglądarce widać granice
wszystkich komórek — już niebawem się tego pozbędziemy!
Komórka menu ma szerokość 200 punktów, podobnie zresztą jak główny panel kontrolki
MenuBanku. Zauważ, że cały tekst kontrolki jest umieszczony na panelu o szerokości
200 punktów — tak jak komórka menu w tabeli głównej — oraz o wysokości 1 punktu.
Dzięki temu kontrolka menu dopasowuje się do zawartości strony. Także sama
konstrukcja kontrolki (cały tekst na panelu) zapewni możliwość dynamicznej zmiany jej
zawartości. Natomiast główna komórka zawierająca treść strony ma szerokość wynoszącą
100%. Umożliwia to zachowanie stałej szerokości menu nawigacyjnego, niezależnie od
rozmiaru okna przeglądarki.
Komórka statusu zawiera etykietkę o nazwie Status. Kontrolka ta ma pustą właściwość
Text oraz jest ukryta (jej właściwość Visible jest równa False). Etykietka ta służy do
wyświetlania pomocniczych komunikatów, przydatnych na etapie tworzenia strony
— w skończonej aplikacji nie jest ona już potrzebna.
Zaglądając na zakładkę All można zauważyć w drugiej linii pliku dyrektywę <%@
Register. Służy ona do włączenia do strony definicji kontrolki menu oraz podania nazwy
znacznika, który będzie ją wywoływał. Istotną rzeczą jest tutaj zwrócenie uwagi na
ścieżkę do kontrolki Menu.ascx, która zaczyna się od ukośnika (czyli katalogu głównego
serwera). Jest ona konieczna, ponieważ w dalszym etapie prac będziemy tworzyć
podkatalogi z kolejnymi stronami, a taka ścieżka do kontrolki menu zapewni nam zawsze
dostęp do tej samej kontrolki. Innymi słowy, ścieżki takiej nie trzeba będzie zmieniać.
Schematyczne przedstawienie zależności między plikami wykorzystywanymi na stronie
Layout.aspx znajduje się poniżej:
4
Złożone aplikacje ASP.NET
Layout.aspx
bank.css
arkusz
stylów
użycie przez
<link> HTML
strona
włączenie przez
ASP.NET
Menu.ascx
kontrolka
Rysunek 3. Zależności między plikami na stronie Layout.aspx
5.2. Budowa interfejsu użytkownika
Najwyższa pora przystąpić do działań — rozpoczniemy je od użycia i rozbudowy styli.
W tym celu wykonaj poniższe czynności:
1. Załóż na dysku twardym własny katalog na pliki dla tego projektu.
2. Skopiuj do tego katalogu z załączonych materiałów zawartość katalogu MojBank, czyli
następujące podkatalogi: ascx, style, temp oraz plik Layout.aspx.
3. Otwórz program WebMatrix.
4. Odszukaj i otwórz skopiowany plik Layout.aspx, możesz sprawdzić, czy strona działa
poprawnie.
5. Przejdź do zakładki HTML i w sekcji <head> strony wpisz znacznik <link>, jak
pokazano poniżej; zauważ, że ścieżka do pliku bank.css ponownie zaczyna się od
ukośnika. Takiej ścieżki nie trzeba będzie zmieniać w stronach umieszczonych
w podkatalogach.
Przykład 11. Włączenie do strony kaskadowego arkusza stylów (CSS)
<html>
5
Złożone aplikacje ASP.NET
<head>
<link href="/style/bank.css" type="text/css" rel="stylesheet" />
</head>
6. Zaznacz komórkę caption, klikając raz przed słowem MÓJ.
7. Ustaw w tej komórce właściwość bgColor, na wybraną wartość (sugestia:
YellowGreen).
8. Zaznacz komórkę menu, klikając raz w kontrolkę MenuBanku i wciskając kursor
w lewo.
9. Ustaw w tej komórce właściwość bgColor, na wybraną wartość (sugestia: Beige).
10. Ustaw także jej wysokość (właściwość height) na 400px.
11. Zaznacz komórkę copyright, klikając raz np. w napis Copyright.
12. Ustaw tej komórce właściwość bgColor na wybraną wartość (sugestia: Beige).
13. Zmień także w kontrolce LnkAutor adres e-mail na swój, modyfikując właściwości
NavigateUrl oraz Text.
14. Sprawdź, czy podoba ci się wygląd strony.
15. Zaznacz główną tabelę (kliknij w jedną z jej ramek) i usuń z tabeli ramkę, ustawiając
jej właściwość border na 0 (zero).
16. Otwórz plik bank.css z podkatalogu style. Dodaj style ramek dla komórek, jak
poniżej. Sprawdź, czy podoba ci się wygląd strony.
Przykład 12. Rozbudowa arkusza stylów — dodanie ramek wokół wybranych komórek
td.caption {
font-size: 200%;
border: black 1px dashed;
}
td.menu {
border: black 1px solid;
}
td.copyright {
font-size: 60%;
border: black 1px dashed;
}
6
Złożone aplikacje ASP.NET
Udało ci się zaprojektować szkielet wyglądu witryny! Zapisz bieżącą kopię pliku
Layout.aspx w podkatalogu temp. Będzie to kopia zapasowa na wypadek, gdyby trzeba
było zrobić coś jeszcze raz.
5.3. Witryna o wielu stronach
Nasza witryna będzie docelowo posiadać wiele stron. Przy tej okazji wynikną dwa
problemy, a mianowicie: jak zapewnić spójny wygląd witryny oraz jak poradzić sobie
z przyszłymi ewentualnymi jego zmianami?
Podejście najprostsze, polegające na kopiowaniu pliku Layout.aspx i zmianie treści strony
jest zaprzeczeniem znanej już reguły DRY (ang. Don’t Repeat Yourself), gdyż zmiany
wyglądu trzeba wprowadzać we wszystkich powstałych już dotąd plikach. Może natomiast
sprawdzić się podejście bazujące na wstawianiu w określone miejsca strony kontrolek,
zawierających stałe elementy strony. Zmiany ograniczają się wtedy tylko do treści
kontrolek. Nie zapewni to jednak elastyczności przy zmianach liczby takich elementów
czy ich położenia na stronie.
Najprostszym rozwiązaniem jest wykorzystanie plików włączanych. Każda nowa strona
będzie zawierać przede wszystkim treść, deklaracje znaczników dla kontrolek oraz dwie
dyrektywy włączające „górną” część strony — przed właściwą treścią, oraz „dolną” część
strony — za treścią. Schematycznie można przedstawić to tak:
7
Złożone aplikacje ASP.NET
bank.css
użycie
Strona.aspx
arkusz
stylów
TREŚĆ
strona
włączenie
Menu.ascx
Header.txt
Footer.txt
TREŚĆ
kontrolka
TREŚĆ
Rysunek 4. Pliki włączane, zapewniające wspólny wygląd dla wszystkich stron witryny
5.4. Wykorzystanie plików włączanych
Podzielimy teraz stronę Layout.aspx na trzy części, zgodnie z powyższym schematem.
Będą to pliki: Strona.aspx, Header.txt oraz Footer.txt. Ich zadaniem będzie uproszczenie
procesu tworzenia nowych stron, przy zachowaniu maksimum elastyczności definiowania
wyglądu witryny. Ewentualne zmiany wyglądu będą możliwe bez konieczności zmian
w już istniejących stronach i będą ograniczać się tylko do plików Header.txt i Footer.txt.
Po włączeniu do strony plik Header.txt będzie tworzyć „górną część” (nagłówek) strony.
Za nią będzie można zbudować jej właściwą zawartość, nie martwiąc się o zachowanie
spójnego układu witryny. Następnie włączany do strony plik Footer.txt będzie tworzyć jej
„dolną część” (stopkę), zamykając szablon.
8
Złożone aplikacje ASP.NET
W celu zmiany sposobu organizacji strony wykonaj następujące czynności:
1. Otwórz plik Layout.aspx (lub znajdź go na liście otwartych dokumentów).
2. Zapisz go pod nową nazwą: Strona.asp.
3. Przejdź na zakładkę HTML i zauważ, że w treści strony wstawione są komentarze.
Przykład 13. Kod HTML z zaznaczonymi sekcjami nagłówka i stopki strony
<body>
<form runat="server">
<!-- POCZĄTEK PLIKU Header.txt -->
<div align="center">
...
<td class="main" valign="top" width="100%">
<!-- KONIEC PLIKU Header.txt -->
<p>
<font size="4"><strong>TYTUŁ</strong></font>
</p>
<p>
treść
</p>
<!-- POCZĄTEK PLIKU Footer.txt -->
</td>
...
</div>
<!-- KONIEC PLIKU Footer.txt -->
</form>
</body>
4. Zaznacz i skopiuj linie od komentarza <!-- POCZĄTEK PLIKU Header.txt -->
włącznie, aż do komentarza <!-- KONIEC PLIKU Header.txt -->.
5. Załóż nowy plik tekstowy, poleceniem File  New File  Text File (z sekcji General),
podając nazwę Header.txt.
6. Wklej do pliku skopiowane linie i zapisz go; możesz również zamknąć ten plik.
7. Podobnie zaznacz i skopiuj linie od komentarza <!-- POCZĄTEK PLIKU Footer.txt
--> włącznie, aż do komentarza <!-- KONIEC PLIKU Footer.txt -->.
8. Załóż nowy plik tekstowy, poleceniem File  New File  Text File (z sekcji General),
podając nazwę Footer.txt.
9. Wklej do pliku skopiowane linie i zapisz go; możesz zamknąć plik.
10. Wróć do pliku Strona.aspx i usuń skopiowane linie, zamiast nich wpisz dyrektywy
włączające treść plików Header.txt oraz Footer.txt.
9
Złożone aplikacje ASP.NET
Przykład 14. Kod HTML z dyrektywami włączającymi pliki
<body>
<form runat="server">
<!-- #Include file="Header.txt" -->
<p>
<font size="4"><strong>TYTUŁ</strong></font>
</p>
<p>
treść
</p>
<!-- #Include file="Footer.txt" -->
</form>
</body>
Zapisz plik Strona.aspx i sprawdź, czy poprawnie działa. Jeśli tak, to gratulacje! Masz
w tym momencie dobrze zrobiony szablon dla stron witryny bankowej!
Zapisz bieżącą kopię pliku Strona.aspx w podkatalogu temp — będzie to kopia zapasowa,
służąca jako punkt wyjścia do tworzenia nowych stron witryny.
Jeśli chcesz mieć porządek w projekcie, możesz usunąć z katalogu głównego projektu
pliki Layout.aspx i Strona.aspx. Nie chcesz chyba pozwalać użytkownikom na zaglądanie
na te strony?
5.5. Przygotowanie szkieletu witryny
Ta część jest raczej łatwa i polega na stworzeniu — w oparciu o plik Strona.aspx
— dziewięciu nowych stron ASP.NET oraz dwóch katalogów. W tym celu wykonaj
następujące czynności:
1. Otwórz plik Strona.aspx z podkatalogu temp.
2. Zmień napis TYTUŁ na Strona główna, możesz usunąć słowo treść; zapisz zmieniony
plik w katalogu głównym pod nową nazwą Default.aspx.
3. Podobnie postępując, stwórz pozostałe pliki, zgodnie z poniższą tabelą.
Tabela 2. Podstawowe strony witryny
Katalog
MojBank
Nazwa pliku
Default.aspx
10
Tytuł strony
Strona główna
Złożone aplikacje ASP.NET
Regulamin.aspx
Cennik.aspx
Wyloguj.aspx
Testy.aspx
Regulamin
Oprocentowanie i prowizje
Zakończenie pracy
Testy
4. W katalogu głównym projektu załóż dwa podkatalogi: bank i klient.
5. Zmień tytuł strony na Twój profil; przejdź do zakładki HTML i popraw ścieżki do
włączanych plików Header.txt i Footer.txt.
Przykład 15. Kod HTML z dyrektywami włączającymi pliki z katalogu nadrzędnego
<body>
<form runat="server">
<!-- #Include file="../Header.txt" -->
<p>
<font size="4"><strong>TYTUŁ</strong></font>
</p>
<p>
treść
</p>
<!-- #Include file="../Footer.txt" -->
</form>
</body>
6. Zapisz zmieniony plik w podkatalogu klient pod nową nazwą Default.aspx.
7. Zmień napis Twój profil na Twoje konta, zapisz zmieniony plik w podkatalogu klient
pod nową nazwą: TwojeKonta.aspx.
8. Podobnie postępując, stwórz w podkatalogu bank pliki Default.aspx i Kasa.aspx,
zgodnie z poniższą tabelą.
Tabela 3. Dodatkowe strony witryny, dostępne po zalogowaniu
Katalog
MojBank\klient
MojBank\bank
Nazwa pliku
Default.aspx
TwojeKonta.aspx
Default.aspx
Kasa.aspx
Tytuł strony
Twój profil
Twoje konta
Administracja
Obsługa klienta
9. Zapisz dokonane zmiany i sprawdź, czy masz dostęp do wszystkich stron przez menu
nawigacyjne.
11
Złożone aplikacje ASP.NET
6. Wykorzystanie sesji
Jak wiadomo, sesja jest obiektem pozwalającym przechować informacje powiązane
z użytkownikiem korzystającym z aplikacji. Może to być np. identyfikator i/lub rola
zalogowanego użytkownika, przez co aplikacja może wybiórczo udostępniać niektóre
strony lub elementy tych stron. Takie właśnie ćwiczenie wykonasz już niebawem. Warto
jednak zauważyć, że nie jest to jedyne rozwiązanie problemu rozpoznawania
użytkownika. Jak się okaże w następnym module, ASP.NET posiada zintegrowane
mechanizmy zabezpieczeń, które w połączeniu z bazą danych użytkowników umożliwią
zaawansowaną kontrolę dostępu do elementów aplikacji.
6.1. Dynamiczna kontrolka menu
Rozbudujesz teraz kontrolkę użytkownika, która będzie dynamicznie wyświetlać bądź
ukrywać zawartość pozycji menu. Pozycje menu będą wyświetlane zależnie od roli
zalogowanego użytkownika, którym będzie albo klient, albo pracownik banku.
Podstawową sprawą jest to, że wystarczy odpowiednio ukrywać wybrane polecenia menu,
aby zapewnić żądaną funkcjonalność. Są to polecenia: Twoje konta, Obsługa klienta
i Zakończenie pracy. Ukrycie takie traktowane jest przez ASP.NET dosłownie — kod HTML
niewidocznych elementów nie jest generowany.
Dla uzyskania pożądanego efektu kontrolka menu zostanie podzielona na trzy części:
polecenia dostępne dla wszystkich (plik Menu.ascx), polecenia dla klientów (plik
MenuKlient.ascx) oraz polecenia dla pracowników (plik MenuPracownik.ascx). W tym celu
wykonaj poniższe czynności:
1. Znajdź w katalogu ascx plik Menu.ascx i skopiuj go do katalogu temp — będzie to
kopia zapasowa kontrolki menu na wypadek, gdyby trzeba było coś zrobić jeszcze
raz.
2. Otwórz teraz w środowisku Web Matrix plik Menu.ascx z katalogu ascx.
3. Stwórz teraz nową kontrolkę poleceniem File  New File  ASP.NET User Control,
upewnij się czy w polu Language jest wybrana opcja C#, a następnie zapisz tę
kontrolkę w katalogu ascx pod nazwą MenuKlient.ascx.
4. Przejdź do zakładki HTML — jak widzisz, poza komentarzem <!-- Insert content
here --> nic tam nie ma. Umieścisz tutaj kod HTML, który będzie treścią tworzonej
kontrolki. Będzie ona następnie użyta w głównej kontrolce menu.
12
Złożone aplikacje ASP.NET
5. Odszukaj teraz otwarty dokument Menu.ascx i przejdź na zakładkę HTML; wytnij
wskazaną część kodu HTML i przenieś do kontrolki MenuKlient.ascx (znacznik <br/>,
link Twoje konta, znacznik <br/> i link Zakończenie pracy).
Przykład 16. Kod kontrolki menu przenoszony do pliku MenuKlient.ascx
<p>
<asp:Panel id="PanelMenu" runat="server" Width="200px">
<p>
...
<br />
<strong>
<br />
Dla klientów</strong>
<br />
<asp:HyperLink id="LnkKlientDefault" runat="server"
NavigateUrl="/klient/Default.aspx">Twój profil</asp:HyperLink>
<br />
<asp:HyperLink id="LnkKlientKonta" runat="server"
NavigateUrl="/klient/TwojeKonta.aspx">Twoje konta</asp:HyperLink>
<br />
<asp:HyperLink id="LnkKlientWyloguj" runat="server"
NavigateUrl="/Wyloguj.aspx">Zakończenie pracy</asp:HyperLink>
<br />
...
</p>
</asp:Panel>
</p>
6. Zapisz zmiany dokonane w kontrolce MenuKlient.ascx.
7. Podobnie stwórz drugą kontrolkę, wywołując polecenie File  New File  ASP.NET
User Control, upewnij się, czy w polu Language wybrana została opcja C#,
a następnie zapisz tę kontrolkę w katalogu ascx pod nazwą MenuPracownik.ascx.
8. Odszukaj otwarty dokument Menu.ascx i przejdź na zakładkę HTML; wytnij wskazaną
część kodu HTML i przenieś do kontrolki MenuPracownik.ascx (znacznik <br/>, link
Obsługa klienta, znacznik <br/> i link Zakończenie pracy).
13
Złożone aplikacje ASP.NET
Przykład 17. Kod kontrolki menu przenoszony do pliku MenuPracownik.ascx
<p>
<asp:Panel id="PanelMenu" runat="server" Width="200px">
<p>
...
<br />
<strong>
<br />
Obsługa</strong>
<br />
<asp:HyperLink id="LnkBankDefault" runat="server"
NavigateUrl="/bank/Default.aspx">Administracja</asp:HyperLink>
<br />
<asp:HyperLink id="LnkBankKasa" runat="server"
NavigateUrl="/bank/Kasa.aspx">Obsługa klienta</asp:HyperLink>
<br />
<asp:HyperLink id="LnkBankWyloguj" runat="server"
NavigateUrl="/Wyloguj.aspx">Zakończenie pracy</asp:HyperLink>
<br />
<br />
<asp:HyperLink id="LnkTesty" runat="server"
NavigateUrl="/Testy.aspx">Testy</asp:HyperLink>
</p>
</asp:Panel>
</p>
9. Zapisz zmiany dokonane w kontrolce MenuPracownik.ascx.
10. Powróć do dokumentu Menu.ascx i w miejscach, gdzie były wycięte linie wstaw nowe
znaczniki (wywołania utworzonych kontrolek).
14
Złożone aplikacje ASP.NET
Przykład 18. Użycie stworzonych kontrolek wewnątrz głównej kontrolki menu
<p>
<asp:Panel id="PanelMenu" runat="server" Width="200px">
<p>
<asp:HyperLink id="LnkDefault" runat="server"
NavigateUrl="/Default.aspx">Strona główna</asp:HyperLink>
<br />
<strong>
<br />
Ogólne</strong>
<br />
<asp:HyperLink id="LnkRegulamin" runat="server"
NavigateUrl="/Regulamin.aspx">Regulamin</asp:HyperLink>
<br />
<asp:HyperLink id="LnkCennik" runat="server"
NavigateUrl="/Cennik.aspx">Oprocentowanie i prowizje</asp:HyperLink>
<br />
<strong>
<br />
Dla klientów</strong>
<br />
<asp:HyperLink id="LnkKlientDefault" runat="server"
NavigateUrl="/klient/Default.aspx">Twój profil</asp:HyperLink>
<Bank:MenuKlient id="MenuKlient"
runat="server"></Bank:MenuKlient>
<br />
<strong>
<br />
Obsługa</strong>
<br />
<asp:HyperLink id="LnkBankDefault" runat="server"
NavigateUrl="/bank/Default.aspx">Administracja</asp:HyperLink>
<Bank:MenuPracownik id="MenuPracownik"
runat="server"></Bank:MenuPracownik>
<br />
<br />
<asp:HyperLink id="LnkTesty" runat="server"
NavigateUrl="/Testy.aspx">Testy</asp:HyperLink>
</p>
</asp:Panel>
</p>
15
Złożone aplikacje ASP.NET
11. Przejdź na zakładkę All i dodaj wyróżnione dyrektywy rejestrujące znaczniki kontrolek
(bez nich strona nie będzie działać).
Przykład 19. Deklaracje znaczników dla stworzonych kontrolek
<%@ Control Language="C#" %>
<%@ Register TagPrefix="Bank" TagName="MenuKlient" Src="MenuKlient.ascx" %>
<%@ Register TagPrefix="Bank" TagName="MenuPracownik"
Src="MenuPracownik.ascx" %>
<script runat="server">
12. Zapisz wszystkie dokonane zmiany i sprawdź, czy strony nadal poprawnie działają
z nowymi kontrolkami menu.
Sposób wykonania powyższych modyfikacji jest wbrew pozorom bardzo istotny. Chodzi tu
głównie o przenoszony z „dużej” kontrolki kod HTML. Pamiętając, że każda kontrolka ma
za zadanie generować swój kod HTML, warto chwilę zastanowić się, jaki będzie efekt
ukrycia jednej z kontrolek MenuKlient lub MenuPracownik. Otóż spowoduje to, że ich
kodu HTML nie będzie w stronie, którą otrzyma przeglądarka użytkownika. W tym
momencie bardzo istotna jest poprawna kombinacja znaczników <br> przeplatanych
poleceniami menu, zgodna z powyższymi wskazówkami. Tylko wtedy menu pozbawione
części poleceń będzie nadal wyglądać zgodnie z oczekiwaniami.
6.2. Test logowania użytkownika do aplikacji
Aby przetestować ukrywanie pozycji menu, zmodyfikujesz teraz stronę Testy.aspx.
Wybranie pozycji z listy dostępnych ról i wciśnięcie przycisku Ustaw będzie zmieniać rolę
użytkownika. W tym momencie zawartość menu powinna ulec zmianie. Wciśnięcie
przycisku Wyloguj będzie kasować rolę użytkownika. W następnych modułach prosty
model zachowania kontrolki menu oparty na sesjach zostanie rozbudowany
— wykorzystane zostaną bowiem zintegrowane mechanizmy uwierzytelniania
i zabezpieczania aplikacji ASP.NET.
16
Złożone aplikacje ASP.NET
Rysunek 5. Strona do testowania zmian roli użytkownika
W tym celu wykonaj poniższe czynności:
1. Otwórz dokument Testy.aspx, zapisany w głównym katalogu projektu.
2. W górnej części dodaj etykietkę Label, listę rozwijaną DropDownList oraz dwa
przyciski Button.
3. Dla listy rozwijanej DropDownList zmodyfikuj listę elementów (właściwość Items),
dodając przyciskiem Add trzy elementy: –, klient i pracownik, oraz ustaw właściwość
AutoPostBack na True.
4. Ustaw pozostałe właściwości kontrolek zgodnie z poniższą tabelą.
Tabela 4. Kontrolki do zmian roli użytkownika
Kontrolka
Label
DropDownList
Nazwa kontrolki
(ID)
LabRola
DdListRole
ListItem[0]
ListItem[1]
ListItem[2]
Button
Button
BtnUstaw
BtnWyloguj
Nazwa właściwości
Text
AutoPostBack
Text
Value
Text
Value
Text
Value
Text
Text
Wartość właściwości
Rola użytkownika:
True
klient
klient
pracownik
pracownik
Ustaw
Wyloguj
5. Pozostaje tylko ożywić tą stronę. Stwórz więc dla przycisku BtnUstaw obsługę
zdarzenia Click i napisz kod, który będzie dodawał do sesji użytkownika rolę wybraną
z listy przewijanej oraz informował nas o tym.
Przykład 20. Dodawanie do sesji roli użytkownika
void BtnUstaw_Click(object sender, EventArgs e) {
Session["rola"] = DdListRole.SelectedItem.Value;
Status.Text = "Wybrana rola: " + Session["rola"];
Status.Visible = true;
}
6. Stwórz dla przycisku BtnWyloguj obsługę zdarzenia Click i napisz kod, który będzie
usuwał rolę użytkownika z sesji.
Przykład 21. Usuwanie roli użytkownika z sesji
void BtnWyloguj_Click(object sender, EventArgs e) {
Session.Remove("rola");
17
Złożone aplikacje ASP.NET
Status.Text = "";
Status.Visible = false;
}
7. Ostatnim prostym elementem jest uwzględnienie roli użytkownika w kontrolce menu
— przejdź do pliku Menu.ascx i — korzystając z zakładki Design — zaznacz kontrolkę
PanelMenu, dodaj jej obsługę zdarzenia PreRender i wpisz kod ukrywający lub
wyświetlający elementy menu.
Przykład 22. Uzależnienie widoczności kontrolek od roli użytkownika
void PanelMenu_PreRender(object sender, EventArgs e) {
MenuKlient.Visible = (Session["rola"] == "klient");
MenuPracownik.Visible = (Session["rola"] == "pracownik");
}
8. Zapisz wszystkie zmiany i sprawdź działanie strony Testy.aspx.
W obsłudze zdarzenia PreRender panelu można użyć właściwości Visible kontrolek,
ponieważ każda kontrolka dziedziczy składowe z klasy
System.Web.UI.WebControls.Control — w tym interesującą nas Visible.
6.3. Ograniczanie dostępu do wybranych elementów aplikacji
Na koniec dodasz jeszcze jeden element aplikacji, który będzie użyty m.in. w module 5
oraz wyjaśniony dokładniej w module 6. Chodzi o plik konfiguracyjny web.config. Jest to
plik dający bardzo dużą elastyczność i możliwości konfiguracji aplikacji ASP.NET. Można
dzięki niemu zmieniać otoczenie i zachowanie aplikacji bez zmiany jej zawartości czy
kodu.
Tym razem wykorzystasz prosty, ale skuteczny mechanizm, dzięki któremu wybrane pliki
i katalogi nie będą dostępne dla zwykłych użytkowników. Nie będzie więc można odczytać
zawartości plików ani zobaczyć zawartości katalogów przez przeglądarkę (nawet znając
ich nazwy), natomiast z wnętrza samej aplikacji pliki będą oczywiście dostępne.
W celu ograniczenia dostępu do plików wykonaj poniższe czynności:
1. Stwórz nowy plik konfiguracyjny aplikacji, poleceniem File  New File, wskazując
w sekcji General pozycję Web.Config; zapisz ten plik w katalogu głównym projektu
pod wymaganą nazwą web.config.
18
Złożone aplikacje ASP.NET
2. Plik web.config jest dokumentem XML — posiada własne znaczniki i atrybuty; zauważ,
że większość proponowanych sekcji tego pliku jest ujęta w komentarze <!-- i -->
— oznacza to, że ustawienia tam zapisane nie są brane pod uwagę.
3. Przejdź na koniec pliku i dodaj trzy sekcje zabraniające dostępu użytkownikom do
plików Header.txt, Footer.txt oraz do wszystkich plików z katalogu temp.
Przykład 23. Wyłączenie dostępu do wybranych plików i katalogów przez plik web.config
...
<!-The <authorization> section enables developers/administrators
to configure whether a user or role has access to a particular
page or resource.
This is accomplished by adding "<allow>"
and "<deny>" sub-tags beneath the <authorization> section, specifically detailing the users/roles allowed or denied access.
Note: The "?" character indicates "anonymous" users
(ie: non authenticated users).
The "*" character indicates "all" users.
<authorization>
<allow users="joeuser" />
<allow roles="Admins" />
<deny users="*" />
</authorization>
-->
</system.web>
<location path="Header.txt">
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="Footer.txt">
<system.web>
19
Złożone aplikacje ASP.NET
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="temp">
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
</configuration>
4. Zapisz zmiany i powróć do okna przeglądarki; kliknij w dowolne polecenie z menu
nawigacyjnego, zauważ chwilowe opóźnienie, które spowodowane jest wzięciem pod
uwagę przez serwer ASP.NET zmian w konfiguracji aplikacji.
5. Spróbuj zmienić w pasku adresu przeglądarki nazwę otwartego dokumentu, np. na:
http://localhost:8080/Header.txt
http://localhost:8080/Footer.aspx
http://localhost:8080/temp/
6. W pierwszych dwóch przypadkach powinien pojawić się komunikat o błędzie Access
denied, zaś w ostatnim — zawartość katalogu (czyli normalnie); jednak próba odczytu
dowolnego pliku z katalogu temp także powinna powodować taki sam błąd jak
powyżej.
W dalszej części kursu przedstawione zostaną mechanizmy ograniczania dostępu do
wybranych części aplikacji dla niezalogowanych użytkowników. Będą one oparte na
loginach i rolach użytkowników, zapisanych w bazie danych.
20

Podobne dokumenty