Ćwiczenie 13 Temat: Kontrola dostępu w ASP.NET Cel ćwiczenia: W ramach ćwiczenia student zapozna się mechanizmami kontroli dostępu obecnymi w ASP.NET. Nauczy się konfigurować uprawnienia poszczególnych użytkowników serwisu oraz udostępniać możliwość zarządzania użytkownikami przez interfejs WWW.
Mechanizm dostawców (providers) System kontroli dostępu do serwisu ASP.NET domyślnie przewiduje przechowywanie wszystkich danych o użytkownikach w bazie danych serwera MS SQL. Niezbędnym wówczas warunkiem skorzystania z możliwości ASP.NET w tym zakresie jest posiadanie serwera MS SQL, co różnych przyczyn nie zawsze jest wygodne. Aby zwiększyć elastyczność ASP.NET wprowadzono mechanizm dostawców (providers), którzy pośredniczą pomiędzy ASP.NET a składowiskiem danych. Możliwości ich podmiany pozwala połączyć system kontroli dostępu ASP.NET z dowolnym serwerem bazodanowym. Obecne w ASP.NET typy providerów to: MembershipProvider zajmuje się obsługą danych na temat użytkowników serwisu RoleProvider zajmuje się obsługą danych na temat ról użytkowników ProfileProvider zajmuje się obsługą danych profilu użytkownik Standardowi dostawcy dedykowani dla MS SQL są skonfigurowani w głównym pliku konfiguracyjnym machine.config. Ich podmianę można zrealizować dla pojedynczego serwisu w jego pliku web.config. Kod dostawców może zostać wprowadzony do serwisu w postaci skompilowanej i umieszczony w katalog Bin lub w postaci źródłowej i umieszczony w katalogu App_Code. Klasa Membership Klasa Membership udostępnia zestaw metod pozwalających pozyskiwać i modyfikować dowolne informacje o użytkownikach. Metoda CreateUser DeleteUser UpdateUser ValidateUser Opis Stwórz nowego użytkownika Usuń użytkownika Aktualizuj dane użytkownika Sprawdź poprawność danych identyfikujących użytkownia 122
FindUsersByEmail FindUsersByName GetUser GetAllUsers GetNumberOfUsersOnline Odszukaj użytkownika po emailu Odszukaj użytkownika po nazwie Pobierz dane wybranego użytkownika Pobierz wszystkich zarejestrowanych użytkowników Pobierz liczbę aktualnie pracujących użytkowników Klasa MembershipUsers Takie metody klasy Membership, jak GetUser lub GetAllUsers zwracają obiekt lub kolekcję obiektów klasy MembershipUsers, które zawierają pełną informację o użytkowniku. Właściwość UserName Email CreationDate IsOnline IsLockedOut LastLoginDate Opis Nazwa użytkownika Adres pocztowy Data utworzenia Czy aktualnie pracuje? Czy jest zablokowany? Data ostatniego logowania Kontrolka CreateUserWizard Kontrolka CreateUserWizard pozwala zaimplementować dodawanie do serwisu nowych użytkowników. W zasadzie nie wymaga ona konfiguracji. 123
Zadanie 1 1. Rozpakuj plik http://kzi.polsl.pl/ti/cwiczenia/bezpieczny.zip 2. Przeanalizuj strukturę bazy danych Access ASPNetDB.mdb (katalog App_Data), która będzie przechowywać dane o użytkownikach. 3. Przejrzyj kod AccessMembershipProvider (katalog App_Code), którego zadaniem będzie pośredniczenie pomiędzy ASP.NET a bazą Access w zakresie przechowywania danych użytkowników. 4. Odszukaj w pliku web.config podmiany standardowego MembershipProvidera. <membership defaultprovider="accessmembershipprovider"> <providers>\ <clear/> <add name="accessmembershipprovider" type="samples.accessproviders.accessmembershipprovider" connectionstringname="accessfilename" enablepasswordretrieval="false" enablepasswordreset="false" requiresuniqueemail="false" requiresquestionandanswer="false" minrequiredpasswordlength="1" minrequirednonalphanumericcharacters="0" applicationname="samplesite" hashalgorithmtype="sha1" passwordformat="hashed"/> </providers> </membership> 5. W katalogu Administracja utwórz stronę NowiUzytkownicy.aspx. Uwaga! W celu uniknięcia problemów z różnymi wersjami VisualStudio należy wybrać opcję wspólnego pliku kodu HTML i C#. 6. Zaimplementuj w zdarzeniu Load wyświetlanie wszystkich aktualnie zarejestrowanych w serwisie użytkowników na liście BulletedList. Wykorzystaj klasę 124
Membership. Użyj pętli foreach. Pamiętaj o każdorazowym wyczyszczeniu kolekcji Items listy. 7. Przy pomocy kontrolki CreateUserWizard uzupełnij stronę NowiUzytkownicy.aspx o możliwość dodawania nowych użytkowników. Autentykacja oparta o formularze ASP.NET udostępnia trzy podstawowe typy autentykacji (uwierzytelnienia użytkownika): Windows opartą o pulę użytkowników i mechanizmy Windows Forms opartą o formularz umieszczony na stronie WWW i pulę użytkowników przechowywaną w oddzielnej bazie danych Password opartą o serwis WWW firmy Microsoft przechowujący dane identyfikacyjne użytkowników i realizujący ich autentykację. Najpopularniejszą metodą autentykacji serwisów WWW jest metoda oparta o formularze WWW. W celu aktywacji dla wybranego serwisu ASP.NET w jego pliku web.config, w sekcji system.web powinien znaleźć się wpis: <authentication mode="forms"> <forms loginurl="mylogin.aspx" defaulturl="login.aspx"/> </authentication> Atrybut loginurl wskazuje stronę internetową, na którą zostanie automatycznie przekierowany użytkownik przy próbie dostępu do zasobu wymagającego uwierzytelnienia. Atrybut defaulturl wskazuje, na którą stronę użytkownik zostanie przekierowany po zalogowaniu, kiedy pierwszą odwiedzoną stroną była strona logowania. W przeciwnym wypadku użytkownik wraca na stronę, której próba otwarcia wymagała zalogowania. 125
Kontrolka Login Kontrolka Login udostępnia funkcjonalność uwierzytelnienia użytkownika na podstawie jego identyfikatora i hasła. Powinna znaleźć się na stronie realizującej logowanie (np. mylogin.aspx) Autoryzacja Autoryzacja polega na określeniu, jakie uprawnienia przysługują już zalogowanym użytkownikom. Domyślnie dostępem do całości serwisu dysponują wszyscy użytkownicy anonimowi i zarejestrowani. W celu zabezpieczenia dostępu do całego serwisu WWW lub jego katalogu należy umieścić w odpowiednim pliku web.config (głównym lub w jednym z podkatalogów) sekcje authorization. <system.web> <authorization> <allow users="adam"/> <deny users="*" /> </authorization> </system.web> Poniżej przykład zastosowania autoryzacji, ze wskazaniem ścieżki do pliku: <location path="katalog/plik.aspx"> <system.web> <authorization> <allow users="adam"/> <deny users="*" /> </authorization> </system.web> </location> 126
Wpis allow zezwala na dostęp do wybranego katalogu (I jego podkatalogów) wybranym użytkownikom. Wpis deny zabrania dostępu wybranym użytkownikom. Symbol * oznacza wszystkich użytkowników (zarejestrowanych i anonimowych). Symbol? oznacza użytkowników anonimowych. Ważna jest kolejność wpisów. Nie można w kolejnych wpisać anulować raz przydzielonego zezwolenia lub zakazu. Zapis: <deny users="*" /> <allow users="adam"/> Oznacza, że wszystkim użytkownikom odebrano prawo dostępu (także użytkownikowi adam) a drugi w kolejności wpis nie może już tego cofnąć. Zadanie 2 1. Zabroń użytkownikom anonimowy dostępu do całego serwisu. 2. W głównym katalogu serwisu utwórz stronę Logowanie.aspx w oparciu o kontrolkę Login. 3. W głównym pliku web.config wskaż stronę Logowanie.aspx, jako stronę obsługującą proces logowania. 4. Przetestuj działanie serwisu wchodząc na strony Default.aspx i NowyUżytkownik.aspx. 5. Zezwól na dostęp do stron w katalogu Administracja tylko użytkownikowi jkowal. 6. Przetestuj dostęp do stron logując się jako użytkownik kowal (hasło: jkowal123) oraz inny użytkownik Kontrolka LoginStatus Kontrolka LoginStatus zapewnia dwie funkcjonalności: Wyświetla informację, czy aktualnie pracujący użytkownik to użytkownik zalogowany czy anonimowy Użytkownikowi zalogowanemu pozwala się wylogować, a anonimowemu przejść na stronę logowania 127
Kontrolka LoginView Kontrolka LoginView pozwala wyświetlić dwie różne, zdefiniowane przez twórcę serwisu treści dla użytkownika zalogowanego i niezalogowanego. Wygląd definiuje się w schematach dla użytkowników anonimowych AnonymousTemplate i użytkowników zalogowanych LoggedInTemplate. Kontrolka LoginName Kontrolka LoginName wyświetla nazwę aktualnie zalogowanego użytkownika. Jeżeli jest to użytkownik anonimowy, kontrolka pozostaje pusta. Zadanie 3 1. Daj prawo dostępu do głównego katalogu serwisu wszystkim użytkownikom (anonimowym i zalogowanym) 2. Umieść na stronie Default.aspx kontrolkę LoginStatus.. Przetestuj jej działanie. 3. Dodaj do strony Default.aspx następującą funkcjonalność: Użytkownik niezalogowany ma zobaczyć tekst: Zaloguj się. Uzyskasz dodatkowe możliwości. Użytkownik zalogowany (np. Adam) zobaczy następujący tekst: Witam w naszym serwisie Adam. " 4. Przetestuj działanie serwisu 128