Praktycznie każda większa witryna internetowa, zawiera obecnie informacje dostępne wyłącznie dla pewnej specyficznej grupy użytkowników. Mogą być to na przykład płatne artykuły, informacje przeznaczona wyłącznie dla pracowników lub klientów firmy. Pracując w Internecie dostęp do tego typu zasobów najczęściej uzyskuje się po podaniu loginu i hasła. Bezpieczeństwo naszych prywatnych danych pozwalają zachować dwa główne procesy. Pierwszym z nich jest identyfikacja użytkownika, polegająca na sprawdzeniu tożsamości użytkownika aplikacji. Kolejnym krokiem jest autoryzacja, w którym na podstawie podanych danych użytkownik uzyskuje dostęp do zasobów.
Technologia ASP.NET daje twórcą stron internetowych możliwość sprawdzania tożsamości użytkownika na kilka sposobów. Generalnie, wyróżniamy trzy podstawowe sposoby identyfikacji.
Windows authentication – identyfikuje i nadaje prawa dostępu użytkownikom, na podstawie danych zawartych w systemie operacyjnym serwera. Najczęściej sprowadza się to do tego, że konta użytkowników na serwerze, umożliwiają równocześnie uzyskanie prawa dostępu do ukrytych zasobów naszej witryny internetowej.
Forms authentication – w tym przypadku, użytkownik musi skorzystać ze specjalnej strony, na której podaje login i hasło. Informacje użytkownikach nie są przechowywane bezpośrednio w systemie. Identyfikacja i autoryzacja odbywa się na podstawie informacji przechowywanych w bazie danych, specjalnych plikach lub innych źródłach zewnętrznych.
Paszport authentication – w momencie próby uzyskania dostępu do określonych zasobów, użytkownik zostaje przekierowany na specjalną stronę firmy Microsoft, gdzie musi również podać login i hasło. Dane użytkowników przechowywane są przez wspomnianą firmę. Zaletą tego rozwiązania jest możliwość posiadania jednakowych loginów i haseł dla wielu witryn. Jednak z przyczyn niewielkiego zainteresowania tą usługą, sposób ten nie będzie omawiany w dalszej części artykułu.
Spróbujmy w tym momencie uniemożliwić anonimowym użytkownikom dostęp do przykładowej strony, wchodzącej w skład projektu. Jako pierwszą zastosujemy identyfikację Windows. W tym celu do projektu w Visual Studio dodajemy pili Web.config. Następnie odnajdujemy linię zawierającą następujący tekst.
<authentication mode=”Windows” />
Widzimy, że tryb ten jest domyślnym trybem identyfikacji naszej aplikacji. Próba wyświetlenia zawartości strony kończy się jednak sukcesem.
Wynika to z faktu, że musimy jeszcze odpowiedni skonfigurować identyfikacje i autoryzację. W tym celu dodajemy do pliku Web.config następującą treść:
<authorization>
<deny
users=”*”>
<allow
users=”nazwaKomputera\UserName”>
</authorization>
Przy próbie uruchomienia strony powinno pojawić się wówczas następujące okno.
Aby wejść na stronę musimy podać login i hasło. W przypadku identyfikacji Windows loginy i hasła użytkowników pokrywają się z loginami i hasłami używanymi w systemie operacyjnym.
Wyobraźmy sobie sytuację, w której w systemie operacyjnym istnieją konta dla pięćdziesięciu różnych użytkowników. W metodzie podanej powyżej loginy wszystkich tych osób musiałyby znajdować się w pliku konfiguracyjnym aplikacji. W takim przypadku o wiele łatwiej jest zamieścić w nim następującą klauzulę.
<authorization>
<deny
users=”?”>
</authorization>
W tym przypadku aplikacja będzie odrzucać wszystkich użytkowników, niezidentyfikowanych przez system operacyjny. Uruchamiając aplikację na komputerze, na którym znajduje się nasza instancja serwera IIS okienko, w którym podajemy login i hasło nie pojawi się. Chcąc jednak zalogować się na stronę na przykład za pośrednictwem sieci Internet, będziemy musieli podać login i hasło.
Identyfikacja Windows daje twórcą aplikacji internetowych wiele różnych możliwości. Wyobraźmy sobie sytuację, w której przygotowujemy stronę, na której zamieszczane będą wyłącznie materiały przeznaczone dla administratorów systemu Windows. Natomiast użytkownicy, nie będący administratorami, przy próbie otwarcia strony powinni być przekierowywani do miejsca, zawierającego stosowną informację. Funkcjonalność tą możemy w łatwy sposób osiągnąć używając do tego obiektu User. Metoda PageLoad naszej aplikacji wyglądać będzie wówczas następująco:
protected void Page_Load(object sender, EventArgs e)
{
if
(this.User.IsInRole("Administratorzy"))
{
this.Response.Write("Jesteś
administratorem. Witaj w serwisie");
}
else
{
this.Response.Redirect("StronaInformacyjna.aspx");
}
}
Wykorzystana przeze mnie metoda IsInRole, jako parametr otrzymuje nazwę grupy w systemie użytkownika. Jeżeli użytkownik do niej rzeczywiście należy metoda zwraca wartość True. W przeciwnym wypadku zwracana jest wartość False.
Drugim, stosowanym znacznie częściej przez twórców aplikacji internetowych, działających w Internecie, trybem identyfikacji użytkownika jest Forms Authentication. Chcąc wykorzystać ten tryb w swojej aplikacji modyfikujemy jej plik konfiguracyjny w następujący sposób.
<authentication
mode="Forms" >
<forms loginUrl="Login.aspx" >
<credentials passwordFormat="Clear">
<user name="Nazwa_Uzytkownika"
password="Haslo_Uzytkownika"/>
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
W przypadku takiej konfiguracji aplikacji nieautoryzowany użytkownik będzie zawsze przenoszony na stronę Login.asxp. Strona ta powinna umożliwiać zalogowanie się do serwisu, na przykład poprzez podanie loginu i hasła. W powyższym przykładzie dane dotyczące użytkowników znowu przechowywane są bezpośrednio w pliku konfiguracyjnym. Jest to jednak sytuacja zdecydowanie nie polecana, w przypadku tworzenia „rzeczywistej” aplikacji, która miałaby funkcjonować w sieci Internet. W tym przypadku loginy i hasła użytkowników powinny być przechowywane w zewnętrznym systemie bazodanowym, najlepiej w formie zaszyfrowanej.
Jak powinna wyglądać zawartość strony Login.aspx. Oprogramowanie procesu logowania użytkownika w ASP.NET 2.0 ułatwiają nowo wprowadzone kontrolki, takie jak Login, LoginStatus, czy PasswordRecovery. My spróbujemy jednak przeprowadzić proces identyfikacji użytkownika wykorzystując do tego dwa proste pola tekstowe oraz przycisk. Zamieśćmy wspomniane obiekty (o nazwach, odpowiednio: txtLogin, txtPassword, btnSubmit) na formatce Login.aspx. Następnie oprogramujmy zdarzenie naciśnięcia przycisku w następujący sposób:
protected void
Button1_Click(object sender, EventArgs e)
{
if(FormsAuthentication.Authenticate(this.txtLogin.Text,
this.txtPassword.Text))
{
FormsAuthentication.RedirectFromLoginPage(this.TextBox1.Text,
true);
}
else
{
this.Response.Write("Niepoprawny
login lub hasło!");
}
}
W projekcie Visual Studio powinniśmy w tym momencie posiadać następujące pliki – opisane powyżej plik Web.config oraz Login.asx i Login.aspx.cs. Dodajmy do projektu formatkę Default.aspx, zawierającą cenne informacje, które nie powinny wpaść w niepowołane ręce J. Następnie skompilujmy projekt i spróbujmy otworzyć stronę Default.aspx woknie przeglądarki. Zostaniemy automatycznie przeniesieni na formatkę Login.aspx, gdzie będziemy musieli podać login i hasło.
W przypadku podania danych, niezgodnych z tymi z pliku konfiguracyjnego, na ekranie ujrzymy stosowny komunikat. Natomiast, gdy podamy prawidłowy login i hasło zostaniemy przeniesieni na stronę Default.aspx.
Przytoczony przeze mnie powyżej kod zawiera dwie ważne metody. Pierwsza z nich Authenticate, jako parametry otrzymuje login i hasło, pobrane z pól tekstowych na formatce Login.aspx. Zwraca ona wartość True, jeżeli podane dane są poprawne. Natomiast metoda RedirectFromLoginPage, jak sama nazwa wskazuje, przekierowuje użytkownika ze strony, oznaczonej w pliku konfiguracyjnym, jako loginUrl.
Powyższy tekst, przedstawia zaledwie niewielki ułamek informacji, związanych w procesami identyfikacji i autoryzacji użytkownika w aplikacjach internetowych. Serdecznie zachęcam wszystkich do pogłębiania wiedzy w tym temacie, jako że zapewnie wcześniej czy później okaże się ona niezbędna. Bardziej zaawansowani użytkownicy zechcą zapewnie skorzystać z nowych kontrolek, udostępnianych w wersji .NET Framework 2.0, co prawdopodobnie znacząco przyśpieszy proces tworzenia tego aspektu działania aplikacji.