Udostępnij za pośrednictwem


Tworzenie schematu członkostwa w programie SQL Server (VB)

autor: Scott Mitchell

Notatka

Od czasu napisania tego artykułu, dostawcy członkostwa ASP.NET zostali zastąpieni przez ASP.NET Identity. Zdecydowanie zalecamy aktualizowanie aplikacji w celu korzystania z platformy ASP.NET Identity, a nie dostawców członkostwa polecanych w tym artykule. ASP.NET Identity ma wiele zalet w stosunku do systemu członkostwa ASP.NET, w tym :

  • Lepsza wydajność
  • Ulepszona rozszerzalność i możliwość testowania
  • Obsługa uwierzytelniania OAuth, OpenID Connect i uwierzytelniania dwuskładnikowego
  • Obsługa identyfikacji opartej na żądaniach
  • Lepsza współdziałanie z platformą ASP.Net Core

pobierz kod lub pobierz plik PDF

Samouczek rozpoczyna się od przeglądania metod dodania niezbędnego schematu do bazy danych w celu użycia SqlMembershipProvider. Następnie przeanalizujemy tabele kluczy w schemacie i omówimy ich przeznaczenie i znaczenie. Ten samouczek kończy się omówieniem, w jaki sposób poinformować aplikację ASP.NET, którego dostawcę powinien używać framework członkostwa.

Wprowadzenie

W dwóch poprzednich samouczkach przeanalizowano użycie uwierzytelniania formularzy w celu zidentyfikowania odwiedzających witrynę internetową. Struktura uwierzytelniania formularzy ułatwia deweloperom rejestrowanie użytkownika w witrynie internetowej i zapamiętowanie ich między wizytami na stronach przy użyciu biletów uwierzytelniania. Klasa FormsAuthentication zawiera metody generowania biletu i dodawania go do plików cookie odwiedzających. FormsAuthenticationModule sprawdza wszystkie żądania przychodzące i, dla tych z prawidłowym biletem uwierzytelniania, tworzy i kojarzy GenericPrincipal i obiekt FormsIdentity z bieżącym żądaniem. Uwierzytelnianie formularzy jest jedynie mechanizmem nadawania biletu uwierzytelnienia dla odwiedzającego podczas logowania oraz, w przypadku kolejnych żądań, analizowania tego biletu w celu określenia tożsamości użytkownika. Aby aplikacja internetowa obsługiwała konta użytkowników, nadal musimy zaimplementować magazyn użytkowników i dodać funkcje do weryfikowania poświadczeń, rejestrowania nowych użytkowników i niezliczonych zadań związanych z kontem użytkownika.

Przed ASP.NET 2.0 to deweloperzy byli odpowiedzialni za implementację wszystkich tych zadań związanych z kontami użytkowników. Na szczęście zespół ASP.NET rozpoznał ten brak i wprowadził strukturę członkostwa z ASP.NET 2.0. Struktura członkostwa to zestaw klas w programie .NET Framework, który udostępnia interfejs programowy do wykonywania podstawowych zadań związanych z kontem użytkownika. Ta struktura jest oparta na modelu dostawcy , który umożliwia deweloperom podłączanie dostosowanej implementacji do standardowego interfejsu API.

Zgodnie z opisem w poradniku Security Basics i ASP.NET Support, platforma .NET Framework jest dostarczana z dwoma wbudowanymi dostawcami członkostwa: ActiveDirectoryMembershipProvider i SqlMembershipProvider. Jak sama nazwa wskazuje, SqlMembershipProvider używa bazy danych programu Microsoft SQL Server jako repozytorium użytkowników. Aby użyć tego dostawcy w aplikacji, musimy poinformować dostawcę, jakiej bazy danych używać jako magazynu. Jak można sobie wyobrazić, SqlMembershipProvider oczekuje, że baza danych użytkownika będzie mieć pewne tabele, widoki i procedury składowane. Musimy dodać ten oczekiwany schemat do wybranej bazy danych.

Ten poradnik rozpoczyna się od analizowania technik dodawania niezbędnego schematu do bazy danych, aby móc używać SqlMembershipProvider. Następnie przeanalizujemy tabele kluczy w schemacie i omówimy ich przeznaczenie i znaczenie. Ten samouczek kończy się omówieniem tego, jak określić aplikacji ASP.NET, którego dostawcę powinna używać platforma Membership.

Zacznijmy!

Krok 1. Podjęcie decyzji o miejscu umieszczania magazynu użytkowników

Dane aplikacji ASP.NET są często przechowywane w wielu tabelach w bazie danych. Podczas implementowania schematu bazy danych SqlMembershipProvider musimy zdecydować, czy należy umieścić schemat członkostwa w tej samej bazie danych co dane aplikacji, czy w alternatywnej bazie danych.

Zalecam znalezienie schematu członkostwa w tej samej bazie danych co dane aplikacji z następujących powodów:

  • Utrzymywalność aplikacja, której dane są zebrane w jednej bazie danych, jest łatwiejsza do zrozumienia, obsługi i wdrażania niż aplikacja mająca dwie oddzielne bazy danych.
  • Integralność Relacyjna poprzez zlokalizowanie tabel członkostwa w tej samej bazie danych co tabele aplikacji, można ustanowić ograniczenia klucza obcego między kluczami podstawowymi w tabelach członkostwa a powiązanymi tabelami aplikacji.

Oddzielenie danych magazynu użytkowników i aplikacji na oddzielne bazy danych ma sens tylko wtedy, gdy masz wiele aplikacji, z których każda korzysta z oddzielnych baz danych, ale musi współużytkować wspólny magazyn użytkowników.

Tworzenie bazy danych

Aplikacja, która została utworzona od drugiego samouczka, nie potrzebuje jeszcze bazy danych. Potrzebujemy jednak jednego teraz dla sklepu użytkownika. Utwórzmy go, a następnie dodajmy do niego schemat wymagany przez dostawcę SqlMembershipProvider (zobacz Krok 2).

Notatka

W tej serii samouczków będziemy używać bazy danych programu Microsoft SQL Server 2005 Express Edition do przechowywania tabel aplikacji i schematu . Ta decyzja została podjęta z dwóch powodów: po pierwsze, ze względu na brak kosztów - wersja Express Edition jest dostępna za darmo i stanowi najłatwiej dostępną wersję programu SQL Server 2005; po drugie, bazy danych programu SQL Server 2005 Express Edition można umieścić bezpośrednio w folderze App_Data aplikacji internetowej, co ułatwia spakowanie bazy danych i aplikacji internetowej razem w jednym pliku ZIP i ponowne wdrożenie bez konieczności specjalnych instrukcji lub opcji konfiguracji. Jeśli wolisz korzystać z wersji programu SQL Server innej niż Express Edition, śmiało to zrób. Kroki są praktycznie identyczne. Schemat SqlMembershipProvider będzie działać z dowolną wersją programu Microsoft SQL Server 2000 i nowszym.

W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy folder App_Data i wybierz polecenie Dodaj nowy element. (Jeśli w projekcie nie widzisz folderu App_Data, kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań, wybierz polecenie Dodaj folder ASP.NET i wybierz pozycję App_Data. W oknie dialogowym Dodawanie nowego elementu wybierz opcję dodania nowej bazy danych SQL Database o nazwie SecurityTutorials.mdf. W tym samouczku dodamy schemat SqlMembershipProvider do tej bazy danych; W kolejnych samouczkach utworzymy dodatkowe tabele do przechwytywania danych aplikacji.

dodawanie nowej bazy danych SQL Database o nazwie SecurityTutorials.mdf do folderu App_Data

Rysunek 1: Dodawanie nowej bazy danych SQL o nazwie SecurityTutorials.mdf Database do folderu App_Data (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Dodanie bazy danych do folderu App_Data powoduje automatyczne dołączenie jej do widoku Eksploratora bazy danych. (W wersji innej niż Express Edition programu Visual Studio Eksplorator bazy danych jest nazywany Eksploratorem serwera). Przejdź do Eksploratora baz danych i rozwiń właśnie dodaną bazę danych SecurityTutorials. Jeśli na ekranie nie widzisz Eksploratora baz danych, przejdź do menu Widok i wybierz pozycję Eksplorator bazy danych lub naciśnij Ctrl+Alt+S. Jak pokazano na rysunku 2, baza danych SecurityTutorials jest pusta — nie zawiera żadnych tabel, widoków i procedur składowanych.

baza danych SecurityTutorials jest obecnie pusta

Rysunek 2: Baza danych SecurityTutorials jest obecnie pusta (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Krok 2. Dodawanie schematuSqlMembershipProviderdo bazy danych

SqlMembershipProvider wymaga zainstalowania określonego zestawu tabel, widoków i procedur składowanych w bazie danych sklepu użytkowników. Te wymagane obiekty bazy danych można dodać przy użyciu narzędzia aspnet_regsql.exe. Ten plik znajduje się w folderze %WINDIR%\Microsoft.Net\Framework\v2.0.50727\.

Notatka

Narzędzie aspnet_regsql.exe oferuje zarówno funkcje wiersza polecenia, jak i graficzny interfejs użytkownika. Interfejs graficzny jest bardziej przyjazny dla użytkownika i jest tym, co omówimy w tym samouczku. Interfejs wiersza polecenia jest przydatny, gdy dodanie schematu SqlMembershipProvider musi zostać zautomatyzowane, na przykład w skryptach kompilacji lub scenariuszach zautomatyzowanego testowania.

Narzędzie aspnet_regsql.exe służy do dodawania lub usuwania usług aplikacji ASP.NET do określonej bazy danych programu SQL Server. Usługi aplikacji ASP.NET obejmują schematy SqlMembershipProvider i SqlRoleProvideroraz schematy dla dostawców opartych na języku SQL dla innych platform ASP.NET 2.0. Musimy podać dwa fragmenty informacji do narzędzia aspnet_regsql.exe:

  • Czy chcemy dodawać lub usuwać usługi aplikacji, i
  • Baza danych, z której ma zostać dodany lub usunięty schemat usług aplikacji

W monitowaniu o użycie bazy danych narzędzie aspnet_regsql.exe prosi nas o podanie nazwy serwera, na którym znajduje się baza danych, poświadczenia zabezpieczeń służące do nawiązywania połączenia z bazą danych oraz nazwę bazy danych. Jeśli używasz wersji programu SQL Server innej niż Express, musisz już znać te informacje, ponieważ są to te same informacje, które należy podać za pośrednictwem parametrów połączenia podczas pracy z bazą danych za pośrednictwem strony internetowej ASP.NET. Ustalenie nazwy serwera i bazy danych przy korzystaniu z bazy danych w SQL Server 2005 Express Edition w folderze App_Data jest jednak nieco bardziej skomplikowane.

W poniższej sekcji przedstawiono prosty sposób określania nazwy serwera i bazy danych dla bazy danych programu SQL Server 2005 Express Edition w folderze App_Data. Jeśli nie używasz programu SQL Server 2005 Express Edition, możesz przejść do sekcji Instalowanie usług aplikacji.

Określanie nazwy serwera i bazy danych dla bazy danych programu SQL Server 2005 Express Edition w folderzeApp_Data

Aby użyć narzędzia aspnet_regsql.exe, musimy znać nazwy serwera i bazy danych. Nazwa serwera to localhost\InstanceName. Najprawdopodobniej InstanceName jest SQLExpress. Jeśli jednak zainstalowano ręcznie program SQL Server 2005 Express Edition (tj. nie zainstalowano go automatycznie podczas instalowania programu Visual Studio), możliwe jest, że wybrano inną nazwę wystąpienia.

Nazwa bazy danych jest nieco trudniejsza do określenia. Bazy danych w folderze App_Data zazwyczaj mają nazwę bazy danych, która zawiera globalnie unikatowy identyfikator wraz ze ścieżką do pliku bazy danych. Musimy określić tę nazwę bazy danych, aby dodać schemat usług aplikacji za pomocą aspnet_regsql.exe.

Najprostszym sposobem ustalenia nazwy bazy danych jest sprawdzenie jej za pośrednictwem programu SQL Server Management Studio. Program SQL Server Management Studio udostępnia graficzny interfejs do zarządzania bazami danych programu SQL Server 2005, ale nie jest dostarczany z programem Express Edition programu SQL Server 2005. Dobrą wiadomością jest, że można pobrać bezpłatną wersję Express SQL Server Management Studio.

Notatka

Jeśli na pulpicie zainstalowano również wersję programu SQL Server 2005 inną niż Express Edition, prawdopodobnie zainstalowano pełną wersję programu Management Studio. Możesz użyć pełnej wersji, aby określić nazwę bazy danych, wykonując te same kroki, co opisane poniżej dla wersji Express.

Zacznij od zamknięcia programu Visual Studio, aby upewnić się, że wszystkie blokady nałożone przez program Visual Studio w pliku bazy danych są zamknięte. Następnie uruchom program SQL Server Management Studio i połącz się z bazą danych localhost\InstanceName dla programu SQL Server 2005 Express Edition. Jak wspomniano wcześniej, jest duże prawdopodobieństwo, że nazwa wystąpienia to SQLExpress. Dla opcji Uwierzytelnianie wybierz pozycję Uwierzytelnianie systemu Windows.

Połącz się z instancją SQL Server 2005 Express Edition

Rysunek 3: Nawiązywanie połączenia z wystąpieniem programu SQL Server 2005 Express Edition (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Po nawiązaniu połączenia z wystąpieniem programu SQL Server 2005 Express Edition Management Studio wyświetla foldery baz danych, ustawień zabezpieczeń, obiektów serwera itd. Po rozwinięciu karty Bazy danych zobaczysz, że baza danych SecurityTutorials.mdf nie jest zarejestrowana w wystąpieniu bazy danych — najpierw musimy dołączyć tę bazę danych.

Kliknij prawym przyciskiem myszy folder Bazy danych i wybierz pozycję Dołącz z menu kontekstowego. Spowoduje to wyświetlenie okna dialogowego Dołączanie baz danych. W tym miejscu kliknij przycisk Dodaj, przejdź do bazy danych SecurityTutorials.mdf, a następnie kliknij przycisk OK. Rysunek 4 przedstawia okno dialogowe Dołączanie baz danych po wybraniu bazy danych SecurityTutorials.mdf. Rysunek 5 przedstawia Eksplorator obiektów programu Management Studio po pomyślnym dołączeniu bazy danych.

Dołącz bazę danych SecurityTutorials.mdf

Rysunek 4: Dołącz bazę danych SecurityTutorials.mdf (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

baza danych SecurityTutorials.mdf jest wyświetlana w folderze Bazy danych

Rysunek 5: Baza danych SecurityTutorials.mdf jest wyświetlana w folderze Bazy danych (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Jak pokazano na rysunku 5, baza danych SecurityTutorials.mdf ma dość zawiłą nazwę. Zmieńmy ją na bardziej pamiętną (i łatwiejszą do wpisywania) nazwę. Kliknij prawym przyciskiem myszy bazę danych, wybierz polecenie Zmień nazwę z menu kontekstowego i zmień jego nazwę SecurityTutorialsDatabase. Nie powoduje to zmiany nazwy pliku, tylko nazwy używanej przez bazę danych do identyfikowania się w programie SQL Server.

zmień nazwę bazy danych na SecurityTutorialsDatabase

Rysunek 6: zmień nazwę bazy danych na SecurityTutorialsDatabase(Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

W tym momencie znamy nazwy serwera i bazy danych dla pliku bazy danych SecurityTutorials.mdf: odpowiednio localhost\InstanceName i SecurityTutorialsDatabase. Teraz możemy zainstalować usługi aplikacji za pomocą narzędzia aspnet_regsql.exe.

Instalowanie usług aplikacji

Aby uruchomić narzędzie aspnet_regsql.exe, przejdź do menu Start i wybierz pozycję Uruchom. Wprowadź %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe w polu tekstowym i kliknij przycisk OK. Alternatywnie możesz użyć Eksploratora Windows, aby przejść do szczegółów odpowiedniego folderu i kliknąć dwukrotnie plik aspnet_regsql.exe. Jedno z tych podejść będzie zawierać te same wyniki.

Uruchomienie narzędzia aspnet_regsql.exe bez żadnych argumentów wiersza polecenia powoduje uruchomienie graficznego interfejsu użytkownika Kreatora instalacji programu SQL Server ASP.NET. Kreator ułatwia dodawanie lub usuwanie usług aplikacji ASP.NET w określonej bazie danych. Pierwszy ekran kreatora, pokazany na rysunku 7, opisuje przeznaczenie narzędzia.

Użyj Kreatora instalacji programu ASP.NET SQL Server, aby dodać schemat członkostwa

Rysunek 7: Użyj Kreatora instalacji programu ASP.NET SQL Server, aby dodać schemat członkostwa (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Drugi krok kreatora pyta nas, czy chcemy dodać usługi aplikacyjne, czy je usunąć. Ponieważ chcemy dodać tabele, widoki i procedury składowane niezbędne dla SqlMembershipProvider, wybierz opcję Konfiguruj program SQL Server dla usług aplikacji. Później, jeśli chcesz usunąć ten schemat z bazy danych, uruchom ponownie tego kreatora, ale zamiast tego wybierz opcję Usuń informacje o usługach aplikacji z istniejącej bazy danych.

wybierz opcję Konfiguruj program SQL Server dla usług aplikacji

Rysunek 8: wybierz opcję Konfiguruj program SQL Server dla usług aplikacji (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Trzeci krok wyświetla monit o informacje o bazie danych: nazwę serwera, informacje o uwierzytelnieniu i nazwę bazy danych. Jeśli wykonano czynności opisane w tym samouczku i dodano bazę danych SecurityTutorials.mdf do App_Data, dołączono ją do localhost\InstanceNamei zmieniono jej nazwę na SecurityTutorialsDatabase, użyj następujących wartości:

  • Serwer: localhost\InstanceName
  • Uwierzytelnianie systemu Windows
  • Baza danych: SecurityTutorialsDatabase

wprowadź informacje o bazie danych

Rysunek 9: wprowadź informacje o bazie danych (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Po wprowadzeniu informacji o bazie danych kliknij przycisk Dalej. Ostatni krok zawiera podsumowanie kroków, które zostaną wykonane. Kliknij przycisk Dalej, aby zainstalować usługi aplikacji, a następnie zakończ, aby ukończyć pracę kreatora.

Notatka

Jeśli do dołączenia bazy danych i zmiany nazwy pliku bazy danych użyto programu Management Studio, pamiętaj, aby odłączyć bazę danych i zamknąć program Management Studio przed ponownym otwarciem programu Visual Studio. Aby odłączyć bazę danych SecurityTutorialsDatabase, kliknij prawym przyciskiem myszy nazwę bazy danych, a następnie z menu Zadania wybierz polecenie Odłącz.

Po zakończeniu pracy kreatora wróć do programu Visual Studio i przejdź do Eksploratora baz danych. Rozwiń folder Tabele. Powinna zostać wyświetlona seria tabel, których nazwy zaczynają się od prefiksu aspnet_. Podobnie różne widoki i procedury składowane można znaleźć w folderach Widoki i Procedury składowane. Te obiekty bazy danych tworzą schemat usług aplikacji. Przeanalizujemy obiekty bazy danych specyficzne dla członkostwa i roli w kroku 3.

dodano różne tabele, widoki i procedury składowane do bazy danych

Rysunek 10: Dodano do bazy danych różne tabele, widoki i procedury składowane (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Notatka

Graficzny interfejs użytkownika narzędzia aspnet_regsql.exe instaluje cały schemat usług aplikacji. Jednak podczas wykonywania aspnet_regsql.exe z wiersza polecenia można określić, jakie składniki usług aplikacji mają zostać zainstalowane (lub usunięte). W związku z tym, jeśli chcesz dodać tylko tabele, widoki i procedury składowane niezbędne dla dostawców SqlMembershipProvider i SqlRoleProvider, uruchom aspnet_regsql.exe z wiersza polecenia. Alternatywnie można ręcznie uruchomić odpowiedni podzbiór skryptów tworzenia języka T-SQL używanych przez aspnet_regsql.exe. Te skrypty znajdują się w folderze WINDIR%\Microsoft.Net\Framework\v2.0.50727\ z nazwami takimi jak InstallCommon.sql, InstallMembership.sql, InstallRoles.sql, InstallProfile.sql, InstallSqlState.sqlitd.

W tym momencie utworzyliśmy obiekty bazy danych wymagane przez SqlMembershipProvider. Jednak nadal musimy poinstruować strukturę członkostwa, że powinna używać SqlMembershipProvider (w przeciwieństwie do ActiveDirectoryMembershipProvider) i że SqlMembershipProvider powinna używać bazy danych SecurityTutorials. Przyjrzymy się, jak określić, jakiego dostawcy użyć, oraz jak dostosować ustawienia wybranego dostawcy w kroku 4. Najpierw przyjrzyjmy się bliżej obiektom bazy danych, które zostały właśnie utworzone.

Krok 3. Spojrzenie na podstawowe tabele schematu

Podczas pracy z strukturami członkostwa i ról w aplikacji ASP.NET szczegóły implementacji są hermetyzowane przez dostawcę. W przyszłych samouczkach omówimy te struktury za pośrednictwem klas Membership i Roles programu .NET Framework. W przypadku korzystania z tych interfejsów API wysokiego poziomu nie musimy się martwić szczegółami niskiego poziomu, takimi jak zapytania wykonywane lub jakie tabele są modyfikowane przez SqlMembershipProvider i SqlRoleProvider.

Biorąc pod uwagę to, możemy bezpiecznie użyć struktur Członkostwa i ról bez eksplorowania schematu bazy danych utworzonego w kroku 2. Jednak podczas tworzenia tabel do przechowywania danych aplikacji może być konieczne utworzenie jednostek powiązanych z użytkownikami lub rolami. Ułatwia zapoznanie się z schematami SqlMembershipProvider i SqlRoleProvider podczas ustanawiania ograniczeń klucza obcego między tabelami danych aplikacji a tymi tabelami utworzonymi w kroku 2. Ponadto, w pewnych rzadkich okolicznościach, może być konieczne nawiązanie interakcji z magazynami użytkowników i ról bezpośrednio na poziomie bazy danych (zamiast za pośrednictwem klas Membership lub Roles).

Podział magazynu użytkowników na aplikacje

Struktury członkostwa i ról zostały zaprojektowane tak, aby jeden magazyn użytkowników i ról mógł być współużytkowany przez wiele różnych aplikacji. Aplikacja ASP.NET korzystająca z platform członkostwa lub ról musi określać, która partycja aplikacji ma być używana. Krótko mówiąc, wiele aplikacji internetowych może używać tego samego magazynu użytkowników i ról. Rysunek 11 przedstawia repozytoria użytkowników i ról podzielone na trzy aplikacje: HRSite, CustomerSite i SalesSite. Te trzy aplikacje internetowe mają własnych unikatowych użytkowników i ról, ale wszystkie fizycznie przechowują swoje konto użytkownika i informacje o rolach w tych samych tabelach bazy danych.

konta użytkowników mogą być podzielone na wiele aplikacji

Rysunek 11: Konta użytkowników mogą być podzielone na wiele aplikacji (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Tabela aspnet_Applications definiuje te partycje. Każda aplikacja, która używa bazy danych do przechowywania informacji o koncie użytkownika, jest reprezentowana przez wiersz w tej tabeli. Tabela aspnet_Applications zawiera cztery kolumny: ApplicationId, ApplicationName, LoweredApplicationNamei Description. ApplicationId jest typu uniqueidentifier i jest kluczem podstawowym tabeli; ApplicationName zapewnia unikatową przyjazną dla człowieka nazwę każdej aplikacji.

Inne tabele związane z członkostwem i rolami nawiązują do pola ApplicationId w aspnet_Applications. Na przykład tabela aspnet_Users zawierająca rekord dla każdego konta użytkownika ma pole klucza obcego ApplicationId; ditto dla tabeli aspnet_Roles. Pole ApplicationId w tych tabelach określa partycję aplikacji, do którego należy konto użytkownika lub rola.

Przechowywanie informacji o koncie użytkownika

Informacje o koncie użytkownika znajdują się w dwóch tabelach: aspnet_Users i aspnet_Membership. Tabela aspnet_Users zawiera pola zawierające podstawowe informacje o koncie użytkownika. Trzy najbardziej istotne kolumny to:

  • UserId
  • UserName
  • ApplicationId

UserId jest kluczem podstawowym (i jest typu uniqueidentifier). UserName jest typu nvarchar(256) i wraz z hasłem tworzy kredencje użytkownika. (Hasło użytkownika jest przechowywane w tabeli aspnet_Membership). ApplicationId łączy konto użytkownika z określoną aplikacją w aspnet_Applications. W kolumnach i istnieje ograniczenie złożone . Gwarantuje to, że w danej aplikacji każda nazwa użytkownika jest unikatowa, ale umożliwia korzystanie z tych samych UserName w różnych aplikacjach.

Tabela aspnet_Membership zawiera dodatkowe informacje o koncie użytkownika, takie jak hasło użytkownika, adres e-mail, data i godzina ostatniego logowania itd. Istnieje korespondencja jeden do jednego między rekordami w tabelach aspnet_Users i aspnet_Membership. Ta relacja jest zapewniana przez pole UserId w aspnet_Membership, które służy jako klucz podstawowy tabeli. Podobnie jak tabela aspnet_Users, aspnet_Membership zawiera pole ApplicationId, które łączy te informacje z określoną partycją aplikacji.

Zabezpieczanie haseł

Informacje o hasłach są przechowywane w tabeli aspnet_Membership. SqlMembershipProvider umożliwia przechowywanie haseł w bazie danych przy użyciu jednej z następujących trzech technik:

  • Clear — hasło jest przechowywane w bazie danych jako zwykły tekst. Zdecydowanie odradzam korzystanie z tej opcji. Jeśli baza danych zostanie naruszona — czy to przez hakera, który znajdzie tylne drzwi lub niezadowolonego pracownika, który ma dostęp do bazy danych - do podjęcia są poświadczenia każdego użytkownika.
  • Zahaszowane — hasła są haszowane przy użyciu jednokierunkowego algorytmu kryptograficznego i losowo wygenerowanej soli. Ta wartość skrótu (wraz z solą) jest przechowywana w bazie danych.
  • Encrypted — zaszyfrowana wersja hasła jest przechowywana w bazie danych.

Użyta technika przechowywania haseł zależy od ustawień SqlMembershipProvider określonych w Web.config. Przyjrzymy się dostosowywaniu ustawień SqlMembershipProvider w kroku 4. Domyślne zachowanie polega na przechowywaniu skrótu hasła.

Kolumny odpowiedzialne za przechowywanie hasła to Password, PasswordFormati PasswordSalt. PasswordFormat to pole typu int, którego wartość wskazuje technikę przechowywania hasła: 0 dla Clear; 1 dla haszowane; 2 dla Encrypted. PasswordSalt jest przypisany losowo wygenerowany ciąg niezależnie od używanej techniki przechowywania haseł; wartość PasswordSalt jest używana tylko podczas obliczania skrótu hasła. Na koniec kolumna Password zawiera rzeczywiste dane hasła, czyli hasło w postaci zwykłego tekstu, skrót hasła lub zaszyfrowane hasło.

Tabela 1 ilustruje, jak te trzy kolumny mogą wyglądać dla różnych technik magazynowania podczas przechowywania hasła MySecret! .

Metoda przechowywania <_o3a_p /> hasło<_o3a_p/> PasswordFormat<_o3a_p/> passwordSalt<_o3a_p/>
Przejrzysty MySecret! 0 tTnkPlesqissc2y2SMEygA==
Haszowany 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= 1 wFgjUfhdUFOCKQiI61vtiQ==
Szyfrowane 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp 2 LSRzhGS/aa/oqAXGLHJNBw==

Tabela 1: Przykładowe wartości pól Password-Related podczas przechowywania hasła MySecret!

Uwaga

Określony algorytm szyfrowania lub wyznaczania skrótu używany przez SqlMembershipProvider jest określany przez ustawienia elementu <machineKey>.

Przechowywanie ról i powiązań ról

Platforma Role umożliwia deweloperom definiowanie zestawu ról i określanie, do jakich ról należą użytkownicy. Te informacje są przechwytywane w bazie danych za pomocą dwóch tabel: aspnet_Roles i aspnet_UsersInRoles. Każdy rekord w tabeli aspnet_Roles reprezentuje rolę dla określonej aplikacji. Podobnie jak tabela aspnet_Users, tabela aspnet_Roles zawiera trzy kolumny istotne dla naszej dyskusji:

  • RoleId
  • RoleName
  • ApplicationId

RoleId jest kluczem podstawowym (i jest typu uniqueidentifier). RoleName jest typu nvarchar(256). A ApplicationId łączy konto użytkownika z określoną aplikacją w aspnet_Applications. W kolumnach RoleName i ApplicationId istnieje ograniczenie złożone UNIQUE, dzięki czemu w danej aplikacji każda nazwa roli jest unikatowa.

Tabela aspnet_UsersInRoles służy jako mapowanie między użytkownikami i rolami. Istnieją tylko dwie kolumny — UserId i RoleId — i razem tworzą złożony klucz podstawowy.

Krok 4. Określanie dostawcy i dostosowywanie jego ustawień

Wszystkie struktury, które obsługują model dostawcy — takie jak struktury członkostwa i ról — nie zawierają samych szczegółów implementacji, a zamiast tego delegują te odpowiedzialność do klasy dostawcy. W przypadku struktury członkostwa klasa Membership definiuje interfejs API do zarządzania kontami użytkowników, ale nie wchodzi bezpośrednio w interakcje z żadnym magazynem użytkowników. Zamiast tego metody klasy Membership przekazują żądanie skonfigurowanemu dostawcy — będziemy używać SqlMembershipProvider. Kiedy wywołujemy jedną z metod w klasie Membership, jak platforma członkostwa wie, aby delegować wywołanie do SqlMembershipProvider?

Klasa Membership ma właściwość Providers zawierającą odwołanie do wszystkich zarejestrowanych klas dostawcy dostępnych do użycia przez platformę członkostwa. Każdy zarejestrowany dostawca ma skojarzoną nazwę i typ. Nazwa oferuje przyjazny dla człowieka sposób odwołowania się do określonego dostawcy w kolekcji Providers, podczas gdy typ identyfikuje klasę dostawcy. Ponadto każdy zarejestrowany dostawca może zawierać ustawienia konfiguracji. Ustawienia konfiguracji struktury członkostwa obejmują między innymi PasswordFormat i requiresUniqueEmail. Zobacz Tabelę 2, aby uzyskać pełną listę ustawień konfiguracji używanych przez SqlMembershipProvider.

Zawartość właściwości Providers jest określana za pośrednictwem ustawień konfiguracji aplikacji internetowej. Domyślnie wszystkie aplikacje internetowe mają dostawcę o nazwie AspNetSqlMembershipProvider typu SqlMembershipProvider. Ten domyślny dostawca członkostwa jest zarejestrowany w machine.config (znajdującym się w %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG):

Ostrzeżenie

Wygląda na to, że przykład, którego szukasz, został przeniesiony! Bądź pewien, że pracujemy nad rozwiązaniem tego problemu.

Jak pokazuje powyższy znacznik, element <membership> definiuje ustawienia konfiguracji dla struktury członkostwa, podczas gdy element podrzędny <providers> określa zarejestrowanych dostawców. Dostawcy mogą być dodawani lub usuwani przy użyciu elementów <add> lub <remove>; użyj elementu <clear>, aby usunąć wszystkich aktualnie zarejestrowanych dostawców. Jak pokazuje znacznik powyżej, machine.config dodaje dostawcę o nazwie AspNetSqlMembershipProvider typu SqlMembershipProvider.

Oprócz atrybutów name i type element <add> zawiera atrybuty definiujące wartości dla różnych ustawień konfiguracji. Tabela 2 zawiera listę dostępnych ustawień konfiguracji SqlMembershipProviderwraz z opisem poszczególnych ustawień konfiguracji.

Notatka

Wszystkie wartości domyślne zanotowane w tabeli 2 odwołują się do wartości domyślnych zdefiniowanych w klasie SqlMembershipProvider. Należy pamiętać, że nie wszystkie ustawienia konfiguracji w AspNetSqlMembershipProvider odpowiadają wartościom domyślnym klasy SqlMembershipProvider. Na przykład, jeśli nie określono tego w dostawcy członkostwa, ustawienie requiresUniqueEmail domyślnie przyjmuje wartość true. Jednak AspNetSqlMembershipProvider zastępuje tę wartość domyślną, jawnie określając wartość false.

ustawienie <_o3a_p/> Opis <_o3a_p />
ApplicationName Pamiętaj, że framework członkostwa pozwala na podział pojedynczego repozytorium użytkowników pomiędzy wiele aplikacji. To ustawienie wskazuje nazwę partycji aplikacji używanej przez dostawcę członkostwa. Jeśli ta wartość nie zostanie jawnie określona, zostanie ustawiona w czasie wykonywania na wartość wirtualnej ścieżki głównej aplikacji.
commandTimeout Określa wartość limitu czasu polecenia SQL (w sekundach). Wartość domyślna to 30.
connectionStringName Nazwa ciągu połączenia w elemencie <connectionStrings> używanym do nawiązywania połączenia z bazą danych magazynu użytkowników. Ta wartość jest wymagana.
description Zawiera przyjazny dla człowieka opis zarejestrowanego dostawcy.
enablePasswordRetrieval Określa, czy użytkownicy mogą pobrać zapomniane hasło. Wartość domyślna to false.
enablePasswordReset Wskazuje, czy użytkownicy mogą zresetować swoje hasło. Wartość domyślna to true.
maxInvalidPasswordAttempts Maksymalna liczba nieudanych prób logowania, które mogą wystąpić dla danego użytkownika podczas określonego passwordAttemptWindow przed zablokowaniem użytkownika. Wartość domyślna to 5.
minRequiredNonalphanumericCharacters Minimalna liczba znaków innych niż alfanumeryczne, które muszą być wyświetlane w haśle użytkownika. Ta wartość musi należeć do zakresu od 0 do 128; wartość domyślna to 1.
minRequiredPasswordLength Minimalna liczba znaków wymaganych w haśle. Ta wartość musi należeć do zakresu od 0 do 128; wartość domyślna to 7.
name Nazwa zarejestrowanego dostawcy. Ta wartość jest wymagana.
passwordAttemptWindow Liczba minut, w których śledzone są nieudane próby logowania. Jeśli użytkownik dostarcza nieprawidłowe poświadczenia logowania maxInvalidPasswordAttempts razy w tym określonym oknie, są one zablokowane. Wartość domyślna to 10.
PasswordFormat Format przechowywania haseł: Clear, Hashedlub Encrypted. Wartość domyślna to Hashed.
passwordStrengthRegularExpression Jeśli jest dostarczone, to wyrażenie regularne jest używane do oceny siły wybranego hasła użytkownika podczas tworzenia nowego konta lub zmiany hasła. Wartość domyślna to pusty ciąg.
requiresQuestionAndAnswer Określa, czy użytkownik musi odpowiedzieć na swoje pytanie zabezpieczające podczas pobierania lub resetowania hasła. Wartość domyślna to true.
requiresUniqueEmail Wskazuje, czy wszystkie konta użytkowników w danej partycji aplikacji muszą mieć unikatowy adres e-mail. Wartość domyślna to true.
type Określa typ dostawcy. Ta wartość jest wymagana.

Tabela 2: Członkostwo i ustawienia konfiguracji SqlMembershipProvider

Oprócz AspNetSqlMembershipProviderinni dostawcy członkostwa mogą być zarejestrowani na podstawie pojedynczych aplikacji, dodając podobny znacznik do tego pliku Web.config.

Notatka

Framework Ról działa w bardzo podobny sposób: w machine.config znajduje się domyślny zarejestrowany dostawca ról, a zarejestrowani dostawcy mogą być dostosowywani dla każdej aplikacji w Web.config. W ramach przyszłego samouczka szczegółowo przeanalizujemy strukturę ról i jej znaczniki konfiguracji.

Dostosowywanie ustawieńSqlMembershipProvider

Domyślny SqlMembershipProvider (AspNetSqlMembershipProvider) ma atrybut connectionStringName ustawiony na LocalSqlServer. Podobnie jak dostawca AspNetSqlMembershipProvider, nazwa parametrów połączenia LocalSqlServer jest zdefiniowana w machine.config.

Ostrzeżenie

Wygląda na to, że przykład, którego szukasz, został przeniesiony! Bądź pewien, że pracujemy nad rozwiązaniem tego problemu.

Jak widać, te parametry połączenia definiują bazę danych programu SQL 2005 Express Edition znajdującą się w lokalizacji |DataDirectory|aspnetdb.mdf. Ciąg |DataDirectory| jest tłumaczony w czasie wykonywania w celu wskazania katalogu ~/App_Data/, więc ścieżka bazy danych |DataDirectory|aspnetdb.mdf przekłada się na ~/App_Data/aspnet.mdf.

Jeśli nie określiliśmy żadnych informacji o dostawcy członkostwa w pliku Web.config aplikacji, aplikacja używa domyślnego zarejestrowanego dostawcy członkostwa, AspNetSqlMembershipProvider. Jeśli baza danych ~/App_Data/aspnet.mdf nie istnieje, środowisko uruchomieniowe ASP.NET automatycznie go utworzy i doda schemat usług aplikacji. Nie chcemy jednak używać bazy danych aspnet.mdf; zamiast tego chcemy użyć bazy danych SecurityTutorials.mdf utworzonej w kroku 2. Tę modyfikację można wykonać na jeden z dwóch sposobów:

  • Określ wartość nazwy parametrów połączeniaLocalSqlServerwWeb.config. Zastąpijąc wartość nazwy parametrów połączenia LocalSqlServer w Web.config, możemy użyć domyślnego zarejestrowanego dostawcy członkostwa (AspNetSqlMembershipProvider) i prawidłowo pracować z bazą danych SecurityTutorials.mdf. Takie podejście jest poprawne, jeśli jesteś zadowolony z ustawień konfiguracji określonych przez AspNetSqlMembershipProvider. Aby uzyskać więcej informacji na temat tej techniki, zobacz wpis w blogu Scott Guthrie, Configuring ASP.NET 2.0 Application Services to Use SQL Server 2000 or SQL Server 2005.
  • Dodaj nowego zarejestrowanego dostawcę typuSqlMembershipProvideri skonfiguruj ustawienieconnectionStringName, aby wskazywało bazę danychSecurityTutorials.mdf. To podejście jest przydatne w scenariuszach, w których chcesz dostosować inne właściwości konfiguracji oprócz parametrów połączenia bazy danych. W moich własnych projektach zawsze używam tego podejścia ze względu na jego elastyczność i czytelność.

Zanim dodamy nowego zarejestrowanego dostawcę odwołującego się do bazy danych SecurityTutorials.mdf, najpierw musimy dodać odpowiednią wartość parametrów połączenia w sekcji <connectionStrings> w Web.config. Poniższy znacznik dodaje nowe parametry połączenia o nazwie SecurityTutorialsConnectionString odwołujące się do bazy danych SecurityTutorials.mdf programu SQL Server 2005 Express Edition w folderze App_Data.

Ostrzeżenie

Wygląda na to, że przykład, którego szukasz, został przeniesiony! Bądź pewien, że pracujemy nad rozwiązaniem tego problemu.

Notatka

Jeśli używasz alternatywnego pliku bazy danych, zaktualizuj parametry połączenia zgodnie z potrzebami. Aby uzyskać więcej informacji na temat tworzenia prawidłowego łańcucha połączenia, odwiedź ConnectionStrings.com.

Następnie dodaj następujący znacznik konfiguracji członkostwa do pliku Web.config. Ten znacznik rejestruje nowego dostawcę o nazwie SecurityTutorialsSqlMembershipProvider.

Ostrzeżenie

Wygląda na to, że przykład, którego szukasz, został przeniesiony! Bądź pewien, że pracujemy nad rozwiązaniem tego problemu.

Oprócz zarejestrowania dostawcy SecurityTutorialsSqlMembershipProvider powyższy znacznik definiuje SecurityTutorialsSqlMembershipProvider jako dostawcę domyślnego (za pośrednictwem atrybutu defaultProvider w elemecie <membership>). Pamiętaj, że platforma członkostwa może mieć wielu zarejestrowanych dostawców. Ponieważ AspNetSqlMembershipProvider jest zarejestrowany jako pierwszy dostawca w machine.config, służy jako dostawca domyślny, chyba że wskazujemy inaczej.

Obecnie nasza aplikacja ma dwóch zarejestrowanych dostawców: AspNetSqlMembershipProvider i SecurityTutorialsSqlMembershipProvider. Jednak przed zarejestrowaniem dostawcy SecurityTutorialsSqlMembershipProvider mogliśmy wyczyścić wszystkich wcześniej zarejestrowanych dostawców, dodając element <clear /> bezpośrednio przed naszym elementem <add>. Umożliwiłoby to wyczyszczenie AspNetSqlMembershipProvider z listy zarejestrowanych dostawców, co oznacza, że SecurityTutorialsSqlMembershipProvider byłby jedynym zarejestrowanym dostawcą członkostwa. Jeśli użyliśmy tego podejścia, nie będziemy musieli oznaczać SecurityTutorialsSqlMembershipProvider jako dostawcy domyślnego, ponieważ byłby to jedyny zarejestrowany dostawca członkostwa. Aby uzyskać więcej informacji na temat używania , zobacz Using When Adding providers(Używanie podczas dodawania dostawców).

Należy pamiętać, że ustawienie SecurityTutorialsSqlMembershipProviderconnectionStringName odwołuje się do właśnie dodanej nazwy ciągu połączenia SecurityTutorialsConnectionString i że jego ustawienie applicationName zostało zmienione na wartość SecurityTutorials. Ponadto ustawienie requiresUniqueEmail zostało ustawione na true. Wszystkie inne opcje konfiguracji są identyczne z wartościami w AspNetSqlMembershipProvider. Jeśli chcesz, możesz w tym miejscu wprowadzić jakiekolwiek modyfikacje konfiguracji. Można na przykład zaostrzyć siłę hasła, wymagając dwóch znaków innych niż alfanumeryczne zamiast jednego lub przez zwiększenie długości hasła do ośmiu znaków zamiast siedmiu.

Notatka

Pamiętaj, że struktura członkostwa umożliwia podział pojedynczej bazy danych użytkowników pomiędzy wiele aplikacji. Ustawienie applicationName dostawcy członkostwa wskazuje, jakiej aplikacji używa dostawca przy pracy z bazą danych użytkowników. Należy jawnie ustawić wartość ustawienia konfiguracji applicationName, ponieważ jeśli applicationName nie jest jawnie ustawiona, jest ona przypisana do wirtualnej ścieżki głównej aplikacji internetowej w czasie wykonywania. Działa to dobrze, o ile wirtualna ścieżka główna aplikacji nie ulegnie zmianie, ale jeśli przeniesiesz aplikację do innej ścieżki, ustawienie applicationName również zmieni się. W takim przypadku dostawca członkostwa rozpocznie pracę z inną partycją aplikacji niż wcześniej. Konta użytkowników utworzone przed przeniesieniem będą znajdować się w innej partycji aplikacji, a ci użytkownicy nie będą już mogli logować się do witryny. Aby zapoznać się z bardziej szczegółowym omówieniem tej kwestii, zobacz Always Set the Property When Configuring ASP.NET 2.0 Membership and Other providers(Konfigurowanie członkostwa ASP.NET 2.0 i innych dostawców).

Streszczenie

W tym momencie mamy bazę danych ze skonfigurowanymi usługami aplikacji (SecurityTutorials.mdf) i skonfigurowaliśmy naszą aplikację internetową tak, aby platforma członkostwa używała właśnie zarejestrowanego dostawcy SecurityTutorialsSqlMembershipProvider. Ten zarejestrowany dostawca jest typu SqlMembershipProvider, jego parametr connectionStringName został ustawiony na odpowiedni łańcuch połączenia (SecurityTutorialsConnectionString), a wartość applicationName została jasno określona.

Teraz jesteśmy gotowi do korzystania z platformy członkostwa z naszej aplikacji. W następnym samouczku sprawdzimy, jak utworzyć nowe konta użytkowników. Następnie zapoznamy się z uwierzytelnianiem użytkowników, wykonywaniem autoryzacji opartej na użytkownikach i przechowywaniem dodatkowych informacji związanych z użytkownikiem w bazie danych.

Szczęśliwe programowanie!

Dalsza lektura

Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami:

Szkolenie wideo dotyczące tematów zawartych w tym samouczku

Informacje o autorze

Scott Mitchell, autor wielu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w 24 godziny. Ze Scottem można się skontaktować pod mitchell@4guysfromrolla.com lub przez jego blog na http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została omówiona przez wielu przydatnych recenzentów. Główny recenzent tego samouczka to Alicja Maziarz. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, napisz do mnie na adres mitchell@4GuysFromRolla.com.