Wstęp do logowania (users, roles, permissions) w ASP.NET

 

Zanim nastąpi kolejna odsłona cyklu o ADO.NET na moim blogu, przedstawiam kolejne zagadnienie, którego wymagała będzie moja aplikacja, a mianowicie logowanie użytkowników. W swojej aplikacji spodziewam się podziału użytkowników na administratorów, zarządców (którzy nie będą np. mieć prawa do usunięcia administratora lub innego zarządcy) oraz użytkowników zwykłych, zarówno zalogowanych jak i anonimowych. Podejście to wymaga zastosowania jakiegoś systemu zarządzania kontami użytkowników. Nie wdając się w skuteczność i jakość tego rozwiązania zdecydowałem się zapoznać z wbudowanym narzędziem ASP.NET, jakim jest Web Site Administration Tool.

Dla przypomnienia mojej konfiguracji, opis odnosił będzie się do następującego zestawu narzędzi:

  • Microsoft Visual Web Developer 2010 Express
  • Microsoft SQL Server 2008 R2 Express

Jak łatwo zarządzać użytkownikami, logowaniem, rolami itp. za pomocą mechanizmów ASP.NET nie będę w tym poście opisywał. Wszystko to można obejrzeć, wchodząc na stronę www.asp.net/learn/security-videos. Przedstawię natomiast, jak zawsze, swoje problemy ze zmuszeniem tego mechanizmu do zadziałania na mojej maszynie. Zaznaczam, że jestem osobą dopiero poznającą technologię ASP.NET, zatem przedstawione przeze mnie czynności w środowiskach innych niż zacisze domowe mogą wymagać odmiennego podejścia.

Zaczynamy od utworzenia nowego projektu. File –> New Project –> (Visual C#) Web –> ASP.NET Web Application –> w polu na dole podajemy oczywiście nazwę aplikacji. Dla ustalenia uwagi niech będzie to LoginApplication. Przeglądając różne przypadkowo znalezione materiały w Internecie natrafić można na prezentacje i opisy, które w celu włączenia funkcji zarządzania użytkownikami pokazują, że należy wybrać z menu Project ostatnią pozycję, czyli ASP.NET Configuration. Następnie, po przejściu do przeglądarki internetowej, należy skierować się do zakładki Security i już można dodać nowego użytkownika itp. Tak, ale jak zawsze jest jakieś “ale” :). Zamiast opcji konfiguracji użytkowników moim oczom ukazuje się komunikat:

“There is a problem with your selected data store. This can be caused by an invalid server name or credentials, or by insufficient permission. It can also be caused by the role manager feature not being enabled. Click the button below to be redirected to a page where you can choose a new data store.
The following message may help in diagnosing the problem: Unable to connect to SQL Server database.”

Dla pewności czy nie da się z tym nic zrobić przechodzimy do zakładki Provider, testujemy połączenie i….

“Could not establish a connection to the database.
If you have not yet created the SQL Server database, exit the Web Site Administration tool, use the aspnet_regsql command-line utility to create and configure the database, and then return to this tool to set the provider.”

Czyli już wiemy, że nie można podłączyć się do bazy danych, ale serwer został dobrze skonfigurowany (co przedstawiłem w jednym z wcześniejszych postów). Komunikat zachęca do zapoznania się narzędziem aspnet_regsql. Służy ono niejako do powiązania bazy danych z naszą aplikacją ASP.NET. Chwila szukania i odpowiedź, co należy zatem zrobić:

  1. Przede wszystkim należy odnależć wyżej wspomniane narzędzie, czyli C:\Windows\Microsoft.Net\  dalej ja framework i odpowiednia wersja. W moim przypadku był to framework64\v4.0.30319\aspnet_regql.exe
  2. Po uruchomieniu wizarda przy domyślnych ustawieniach wybieramy bazę… kolejna niespodzianka, znowu nie można nawiązać połączenia z serwerem. Należy zmienić nazwę w polu Server, gdyż domyślnie znajduje się tam jedynie nazwa komputera, czyli dopisujemy \SQLEXPRESS (nazwa instancji). Teraz już można wybrać bazę danych, w której przechowywane będą ustawienia. Ja na swoje potrzeby utworzyłem wcześniej bazę o nazwie aspnetdb (tak, jest to nazwa domyślnej bazy danych w konfiguracji aplikacji 😉 ) Dwa razy next, potem finish. Wszystko powinno zakończyć się sukcesem.

Powiązanie udało się, Człowiek zadowolony, że baza danych o takiej nazwie jest już domyślnie skonfigurowana w plikach, dodajmy więc nowego użytkownika. Ponownie, tak jak na początku ASP.NET Configuration, security i…. tym razem już komunikat:

“There is a problem with your selected data store. This can be caused by an invalid server name or credentials, or by insufficient permission. It can also be caused by the role manager feature not being enabled. Click the button below to be redirected to a page where you can choose a new data store.
The following message may help in diagnosing the problem: Could not load type ‚LoginApplication.Global’.”

To już daje domyślenia. Ponownie dłuższa chwila szukania i okazuje się, że bez grzebania w plikach konfiguracyjnych się nie obejdzie.

Interesujące dla tego zagadnienia są dwa pliki. Pierwszy znajduje się w podanym wcześniej katalogu z frameworkiem, z tą różnicą, że zamiast wywoływać polecenie aspnet_regsql należy wejść do katalogu Config i w przyjaznym dla oka edytorze otworzyć plik machine.config. W sekcji connectionStrings znajduje się następujący wpis:

<connectionStrings>
        <add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;
Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;
User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>

Wszystko wydaje się być w porządku, jednak zwracam uwagę na nazwę, czyli LocalSqlServer. Dla porównania w pliku Web.config dostępnym w katalogu z naszym projektem z poziomu Visual Studio można odnaleźć wpis:

<connectionStrings>
  <add name="ApplicationServices"
       connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
       providerName="System.Data.SqlClient" />
</connectionStrings>

 
Tutaj nazwa dla odmiany to “ApplicationServices”. Widać zatem, że coś nie gra. Moje rozwiązanie: dodanie własnego, następującego wpisu:

<remove name ="LocalSqlServer"/>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;DataBase=aspnetdb;Uid=AspNetUser;
Pwd=password "/>

oraz zmiana wszystkich wartosci connectionStringName tak, aby znalazł się tam wybrany wpis, czyli LocalSqlServer.

Odrobina wyjaśnień – na początku komendą remove zaznaczamy, że nie chcemy korzystać z wpisu znajdującego się machine.config, a potem dodajemy własny, w którym znajdzie się nazwa wybranej bazy danych, identyfikator użytkownika oraz hasło (wymaga to wcześniejszego utworzenia użytkownika – w moim przypadku AspNetUser, zezwolenia mu na dostęp do serwera i uczynienie go właścicielem wybranej bazy). Widać w tym momencie, że wykorzystane zostało uwierzytelnianie na poziomie SQL Servera, należy więc zadbać także, aby authentication mode w tym pliku został ustawiony na “Forms”.

Pozostaje wybranie z menu Debug opcji Build i już przechodząc do ASP.NET configuration dostajemy możliwość zarządzania użytkownikami 🙂

Uwaga: Ze względu na i tak dość pokaźną długość posta wszelkie nieopisane przeze mnie czynności, niezbędne do wykonania, odnaleźć można w materiale źródłowym, z którego czerpałem swoją wiedzę, czyli: http://www.asp.net/security/videos/configuring-sql-to-work-with-membership-schemas. Rozwiązanie podane przeze mnie ma dla mnie jedną niezaprzeczalną zaletę, mianowicie działa. Zachęcam jednak do komentowania osoby bardziej doświadczone, które mogłyby się wypowiedzieć jak można je udoskonalić.

Wkrótce na blogu zostanie dodany również odnośnik do kodów źródłowych mojej aplikacji, wykorzystujących przedstawione zagadnienie.

Reklamy

2 Responses to Wstęp do logowania (users, roles, permissions) w ASP.NET

  1. mimirus says:

    Bardzo przejrzyste i pomocne arty. Dzięki.

  2. Dzięki! Zachęcam do dalszej lektury i komentowania/wskazówek

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: