czwartek, 20 maja 2010

Autentykacja w ASP.NET

Autentyfikacja podczas pisania aplikacji WWW zawsze stwarzała dużo problemów oraz niepotrzebnie konsumowała czas. Z nowymi kontrolkami które wprowadzono w ASP.NET 2.0 staje się tak prosta jak przeciągnięcie kontrolki na formę (bo i z tym jest związana ).

A więc bez zbędnych rozwodów na temat tego jak dokładnie działa cała struktura stworzona przez Microsoft, skupimy się na sednie i zbudujemy prosty przykład autentyfikacji:

Na początek potrzebujemy bazy danych w której przechowamy dane użytkowników. Tworzymy więc w SQL Server 2008 nową bazę danych. Nazwałem ją po prostu test.
Baza jest póki co pusta i nie zawiera żadnych tabel. W naszej bazie chcemy zarządzać użytkownikami i ich rolami (np. Admin, Power user itp.). Tak wiec potrzebujemy tabel do przechowywania tych informacji. Dzięki narzędziu Aspnet_regsql wygenerujemy je bez problemu.

A więc przystępujemy do dzieła. Uruchamiamy Aspnet_regsql w trybie konsoli (większe możliwości konfiguracyjne niż w „graficznej” wersji wizarda). Standardowo aplikacja znajduje się w lokalizacji:
C:\WINDOWS\Microsoft.NET\Framework\\aspnet_regsql.exe i wprowadzamy komendę. W zależności od tego czy chcemy dodać czy usunąć różne możliwości stosujemy komendy -A (dodaj) lub -R (remove). Do wyboru mamy takie rzeczy jak:
all – wszystko
m – membership
r – role management
p – profile
c – Web parts personalization
w – Web events

Dodatkowo następującymi przełącznikami określamy takie rzeczy jak:
-S – Server np. localhost lub konkretna instancja SQL Server
-U – user id
-P – password
-E – autentyfikacja przy użyciu Windows credentials
-d – baza danych

Tak więc przystępujemy do pracy. W naszym przypadku wystarczy do bazy test dodać: membership, profile oraz role manager:




Tak więc możemy sprawdzić naszą bazę danych:



Jak widać została stworzona podstawa bazy danych. Mamy wszystko co jest niezbędne aby umożliwić autentyfikację.

Przechodzimy więc do Visual Studio i tworzymy nową aplikację internetową ASP.NET. Na początek należy zmodyfikować plik Web.config i uzupełnić go o wpisy dotyczące zarządzania rolami i użytkownikami.
Po otwarciu pliku WebConfig uzupełniamy go o wpisy (opis tego co dodaliśmy znajduje się w komentarzach):

<?xml version="1.0"?>

<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <!--Wstawiamy Connection string do naszej bazy danych gdzie przechowywane są tabele z wymaganymi informacjami-->
  <connectionStrings>
    <add name="dbC" connectionString="Data Source=localhost;Initial Catalog=test;Integrated Security=True" providerName="System.Data.SqlClientr"/>
  </connectionStrings>

    <system.web>
        <authentication mode="Forms" />
        <compilation debug="true" targetFramework="4.0" />

      <!--Konfiguracja membership-->
      <membership defaultProvider="MySqlMembershipProvider">
        <providers>
          <!-- uzupełniamy pola: connectionStringName oraz applicationName; connectionStringName - Podajemy nazwę taką, jaką umieściliśmy w sekcji connectionString-->
          <add connectionStringName="dbC"
            enablePasswordRetrieval="false"
            enablePasswordReset="true"
            requiresQuestionAndAnswer="true"
            applicationName="/"
            requiresUniqueEmail="true"
            maxInvalidPasswordAttempts="5"
            passwordAttemptWindow="10" name="MySqlMembershipProvider"
            type="System.Web.Security.SqlMembershipProvider, System.Web,&#xD;&#xA;Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
            minRequiredPasswordLength="6"
            minRequiredNonalphanumericCharacters="0" />
        </providers>
      </membership>

      <!--Koniguracja obsługi ról-->
      <roleManager enabled="true" defaultProvider="SqlRoleProvider">
        <providers>
          <clear />
          <!--Tak jak poprzednio podajemy nazwę connectionString-->
          <add applicationName="MyAppName"
            connectionStringName="dbC"
            name="SqlRoleProvider"
            type="System.Web.Security.SqlRoleProvider" />
        </providers>
      </roleManager>

    </system.web>

</configuration>


Po tych modyfikacjach uruchamiamy narzędzie ASP.NET Configuration. Za pomocą prostego kreatora dodamy użytkownika i role.

Po uruchomieniu narzędzia przechodzimy do zakładki Security. Przechodzimy do Select authentication type. Zaznaczamy tutaj From the Internet i naciskamy Done:


Następnie klikamy na Enable roles. Dzięki temu będziemy mogli stworzyć jakieś proste role, które następnie wykorzystamy w naszej aplikacji. Klikamy więc na Create or Manage roles i dodajemy nowe role:


Po dodaniu żądanych ról, klikamy na Back. Przejdziemy teraz do tworzenia użytkowników. Wybieramy opcję Create user i wprowadzamy żądane dane:


Po wprowadzaniu danych i kliknięciu Create User po pomyślnej walidacji zostanie dodany nowy użytkownik z wybranymi prawami przez nas.

W tym momencie możemy zamknąć narzędzie. Wrócimy do niego później.

Aby możliwe było logowanie, należy stworzyć stronę przeznaczoną do tego celu. Tworzymy więc WebForms o nazwie login.aspx i modyfikujemy nasz Web.config:

      <authentication mode="Forms">
        <forms loginUrl="login.aspx"></forms>
      </authentication>

Dodając tą klauzulę, mówimy gdzie znajduje się strona pozwalająca na zalogowanie się użytkownika. Następnie na stronie umieszczamy kontrolkę Login. Kontrolka ta prosi użytkownika o wprowadzenie hasła i loginu. Pozwala także na walidację wprowadzonych przez użytkownika danych (np. jeżeli są wymagane cyfry to sprawdzi czy użytkownik wprowadził takowe). Tyle.
To wszystko co należało zrobić aby kontrolka mogła rozpocząć działanie. Oczywiście od nas zależy jej działanie, wyświetlane teksty itd.

Do wykorzystania mamy także inne kontrolki jak np. ChangePassword która umożliwia zmianę hasła użytkownikowi; CreateUserWizard – pozwala na dodawanie nowych użytkowników; LoginName – wyświetla login zalogowanego użytkownika; LoginStatus – wyświetla stan zalogowania; LoginView – pozwala na ustalenie wyświetlanej zawartości w zależności od zalogowanego użytkownika i jego praw.

Aby teraz wykorzystać stworzone role, należy stworzyć formularz logowania oraz foldery. Dla każdej z ról osobny:


Następnie przechodzimy do narzędzia ASP.NET Configuration. Wchodzimy tak jak poprzednio w opcje Security tylko tym razem będziemy zajmować się Access Rules. Klikamy na Create access rulet i z listy filderów (Select a directory for this rule) wybieramy interesujący nas folder np.


Na screenie widzimy że dla folderu Administrator i dla roli Administrator ustalamy zezwolenie na Allow (czyli administrator będzie mógł przeglądać stworzone w tym folderze strony). Dla reszty użytkowników można ustawić brak zezwolenia (Deny).

Oprócz dodawania nowych przywilejów (Create access rulet), możemy także nimi zarządzać (dodawać, usuwać, zmieniać). Dostęp do tych opcji mamy w Manage access rulet. Na screenie widać przykładowo przydzielone przez nas role.


Tyle. Teraz w zależności od roli użytkownika logującego się, zależy jaką zawartość zobaczy po prawidłowym logowaniu.

1 komentarz:

  1. a gdzie przykłady zastosowania? Np.: jak stworzyć własną kontrolkę wykorzystującą ten mechanizm?

    OdpowiedzUsuń