Udostępnij za pośrednictwem


Odblokowywanie i zatwierdzanie kont użytkowników (VB)

Autor : Scott Mitchell

Uwaga / Notatka

Od czasu napisania tego artykułu dostawcy członkostwa ASP.NET zostały zastąpione przez ASP.NET Identity. Zdecydowanie zalecamy aktualizowanie aplikacji w celu korzystania z platformy ASP.NET Identity , a nie dostawców członkostwa proponowanych w czasie pisania tego artykułu. 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 tożsamości opartej na oświadczeniach
  • Lepsza współdziałanie z platformą ASP.Net Core

W tym samouczku pokazano, jak utworzyć stronę internetową dla administratorów w celu zarządzania zablokowanymi i zatwierdzonymi stanami użytkowników. Zobaczymy również, jak zatwierdzić nowych użytkowników dopiero po zweryfikowaniu ich adresu e-mail.

Introduction

Oprócz nazwy użytkownika, hasła i wiadomości e-mail każde konto użytkownika ma dwa pola stanu, które określają, czy użytkownik może zalogować się do witryny: zablokowany i zatwierdzony. Użytkownik jest automatycznie blokowany, jeśli podaje nieprawidłowe poświadczenia określoną liczbę razy w ciągu określonej liczby minut (ustawienia domyślne blokują użytkownika po 5 nieprawidłowych próbach logowania w ciągu 10 minut). Stan zatwierdzony jest przydatny w scenariuszach, w których niektóre działania muszą zostać przeprowadzone, zanim nowy użytkownik będzie mógł zalogować się na witrynę. Na przykład użytkownik może najpierw zweryfikować swój adres e-mail lub zostać zatwierdzony przez administratora, zanim będzie mógł się zalogować.

Ponieważ zablokowany lub niezatwierdzony użytkownik nie może się zalogować, jest to naturalne, aby zastanawiać się, jak te stany można zresetować. ASP.NET nie obejmuje żadnych wbudowanych funkcji ani kontrolek webowych do zarządzania stanami zablokowania i zatwierdzenia użytkowników, częściowo dlatego, że decyzje te muszą być podejmowane indywidualnie dla każdej witryny. Niektóre witryny mogą automatycznie zatwierdzać wszystkie nowe konta użytkowników (zachowanie domyślne). Inni wymagają, aby administrator zatwierdził nowe konta lub nie zatwierdzają użytkowników, dopóki nie odwiedzą linku wysłanego na adres e-mail podany przy rejestracji. Podobnie niektóre witryny mogą blokować użytkowników, dopóki administrator nie zresetuje swojego stanu, podczas gdy inne witryny wysyłają wiadomość e-mail do zablokowanego użytkownika z adresem URL, który może odwiedzić, aby odblokować swoje konto.

W tym samouczku pokazano, jak utworzyć stronę internetową dla administratorów w celu zarządzania zablokowanymi i zatwierdzonymi stanami użytkowników. Zobaczymy również, jak zatwierdzić nowych użytkowników dopiero po zweryfikowaniu ich adresu e-mail.

Krok 1. Zarządzanie zablokowanymi i zatwierdzonymi stanami użytkowników

W samouczku Building an Interface to Select One User Account from Many (Tworzenie interfejsu do wybierania jednego konta użytkownika spośród wielu) utworzyliśmy stronę, która wyświetla każde konto użytkownika w paginowanym, przefiltrowanym widżecie GridView. Siatka wyświetla listę nazw i adresów e-mail każdego użytkownika, ich stanów zatwierdzenia i zablokowania, informację o tym, czy są obecnie online, oraz wszelkie komentarze dotyczące użytkownika. Aby zarządzać stanami zatwierdzonymi i zablokowanymi użytkowników, możemy uczynić tę siatkę edytowalną. Aby zmienić status zatwierdzenia użytkownika, administrator musi najpierw zlokalizować konto użytkownika, a następnie edytować odpowiedni wiersz GridView, zaznaczając lub odznaczając pole wyboru „zatwierdzony”. Alternatywnie można zarządzać stanami zatwierdzonymi i zablokowanymi za pośrednictwem oddzielnej strony ASP.NET.

W tym samouczku użyjemy dwóch stron ASP.NET: ManageUsers.aspx i UserInformation.aspx. Chodzi o to, że ManageUsers.aspx wyświetla listę kont użytkowników w systemie, a jednocześnie UserInformation.aspx umożliwia administratorowi zarządzanie zatwierdzonymi i zablokowanymi stanami dla określonego użytkownika. Naszym pierwszym zadaniem jest rozszerzenie kontrolki GridView w ManageUsers.aspx aby dodać pole HyperLinkField, które renderuje się jako kolumna łączy. Chcemy, aby każdy link wskazywał na UserInformation.aspx?user=UserName, gdzie UserName jest nazwą użytkownika do edycji.

Uwaga / Notatka

Jeśli pobrano kod samouczka Odzyskiwanie i zmienianie haseł , być może zauważysz, że ManageUsers.aspx strona zawiera już zestaw linków "Zarządzaj", a UserInformation.aspx strona zawiera interfejs umożliwiający zmianę hasła wybranego użytkownika. Postanowiłem nie replikować tej funkcji w kodzie skojarzonym z tym samouczkiem, ponieważ działał przez obejście interfejsu API członkostwa i działanie bezpośrednio z bazą danych programu SQL Server w celu zmiany hasła użytkownika. Ten samouczek rozpoczyna się od zera na stronie UserInformation.aspx.

ManageUsers.aspx Otwórz stronę i dodaj obiekt HyperLinkField do kontrolki UserAccounts GridView. Ustaw właściwość Text obiektu HyperLinkField na "Manage", a właściwości DataNavigateUrlFields i DataNavigateUrlFormatString odpowiednio na UserName oraz "UserInformation.aspx?user={0}". Te ustawienia umożliwiają skonfigurowanie pola HyperLinkField tak, aby wszystkie hiperlinki wyświetlały tekst "Zarządzaj", ale każdy link przekazuje odpowiednią wartość UserName do ciągu zapytania.

Po dodaniu pola HyperLinkField do kontrolki GridView poświęć chwilę na wyświetlenie ManageUsers.aspx strony w przeglądarce. Jak pokazano na rysunku 1, każdy wiersz GridView zawiera teraz link "Zarządzaj". Link "Zarządzaj" dla Bruce wskazuje na UserInformation.aspx?user=Bruce, podczas gdy link "Zarządzaj" dla Dave wskazuje na UserInformation.aspx?user=Dave.

Funkcja HyperLinkField dodaje

Rysunek 1. HiperLinkField dodaje link "Zarządzaj" dla każdego konta użytkownika (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Za chwilę utworzymy interfejs użytkownika i kod strony UserInformation.aspx , ale najpierw omówimy sposób programowego zmieniania zablokowanych i zatwierdzonych stanów użytkownika. Klasa MembershipUser maIsLockedOut właściwości i IsApproved. Właściwość IsLockedOut jest tylko do odczytu. Nie ma mechanizmu programowego blokowania użytkownika; aby odblokować użytkownika, użyj MembershipUser metody klasy UnlockUser. Właściwość IsApproved jest czytelna i zapisywalna. Aby zapisać wszelkie zmiany w tej właściwości, musimy wywołać Membershipmetodę klasyUpdateUser, przekazując zmodyfikowany MembershipUser obiekt.

IsApproved Ponieważ właściwość jest czytelna i zapisywalna, kontrolka CheckBox jest prawdopodobnie najlepszym elementem interfejsu użytkownika do konfigurowania tej właściwości. Jednak pole wyboru nie sprawdzi się dla IsLockedOut właściwości, ponieważ administrator nie może zablokować użytkownika, może jedynie odblokować użytkownika. Odpowiedni interfejs użytkownika dla właściwości IsLockedOut jest przyciskiem, który, po kliknięciu, odblokowuje konto użytkownika. Ten przycisk powinien być włączony tylko wtedy, gdy użytkownik jest zablokowany.

UserInformation.aspxTworzenie strony

Teraz jesteśmy gotowi do zaimplementowania interfejsu użytkownika w programie UserInformation.aspx. Otwórz tę stronę i dodaj następujące kontrolki sieci Web:

  • Kontrolka HyperLink, która po kliknięciu ManageUsers.aspx zwraca administratora do strony.
  • Kontrolka webowa Label do prezentacji nazwy wybranego użytkownika. Ustaw tę etykietę ID na UserNameLabel i wyczyść jej właściwość Text.
  • Kontrolka CheckBox o nazwie IsApproved. Ustaw jej AutoPostBack właściwość na True.
  • Kontrola etykiety wyświetlająca ostatnią datę blokady użytkownika. Nadaj tej etykiecie LastLockedOutDateLabel nazwę i wyczyść jej Text właściwość.
  • Przycisk umożliwiający odblokowanie użytkownika. Nadaj temu przyciskowi UnlockUserButton nazwę i ustaw jej Text właściwość na "Unlock User" (Odblokuj użytkownika).
  • Kontrolka typu Etykieta do wyświetlania komunikatów o stanie, takich jak "Status zatwierdzenia użytkownika został zaktualizowany". Nazwij tę kontrolkę StatusMessage, wyczyść jej właściwość Text i ustaw jej właściwość CssClass na Important. Important( Klasa CSS jest zdefiniowana w Styles.css pliku arkusza stylów; wyświetla odpowiedni tekst w dużej, czerwonej czcionki).

Po dodaniu tych kontrolek widok Projektu w programie Visual Studio powinien wyglądać podobnie do zrzutu ekranu na rysunku 2.

Tworzenie interfejsu użytkownika dla UserInformation.aspx

Rysunek 2. Tworzenie interfejsu użytkownika dla UserInformation.aspx (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Gdy interfejs użytkownika jest ukończony, naszym następnym zadaniem jest ustawienie elementu IsApproved CheckBox i innych elementów sterujących na podstawie informacji wybranego użytkownika. Utwórz procedurę obsługi zdarzeń dla zdarzenia strony Load i dodaj następujący kod:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     If Not Page.IsPostBack Then
          ' If querystring value is missing, send the user to ManageUsers.aspx
          Dim userName As String = Request.QueryString("user")
          If String.IsNullOrEmpty(userName) Then
               Response.Redirect("ManageUsers.aspx")
          End If

          ' Get information about this user
          Dim usr As MembershipUser = Membership.GetUser(userName)
          If usr Is Nothing Then
               Response.Redirect("ManageUsers.aspx")

          End If

          UserNameLabel.Text = usr.UserName
          IsApproved.Checked = usr.IsApproved

          If usr.LastLockoutDate.Year < 2000 Then
               LastLockoutDateLabel.Text = String.Empty
          Else
               LastLockoutDateLabel.Text = usr.LastLockoutDate.ToShortDateString()
               UnlockUserButton.Enabled = usr.IsLockedOut
          End If
     End If
End Sub

Powyższy kod rozpoczyna się od sprawdzenia, czy jest to pierwsza wizyta na stronie, a nie kolejne odświeżenie strony. Następnie odczytuje nazwę użytkownika przekazaną user przez pole querystring i za pośrednictwem metody Membership.GetUser(username) pobiera informacje o tym koncie użytkownika. Jeśli żadna nazwa użytkownika nie została podana za pomocą ciągu zapytania lub jeśli nie można odnaleźć określonego ManageUsers.aspx użytkownika, administrator zostanie odesłany do strony.

MembershipUser Wartość obiektu UserName jest następnie wyświetlana w elemencie UserNameLabel, a IsApproved pole wyboru jest zaznaczane na podstawie wartości właściwości IsApproved.

MembershipUser Właściwość obiektu LastLockoutDate zwraca wartość wskazującąDateTime, kiedy użytkownik został ostatnio zablokowany. Jeśli użytkownik nigdy nie został zablokowany, zwracana wartość zależy od dostawcy członkostwa. Po utworzeniu nowego konta SqlMembershipProvider ustawia pole LastLockoutDate w tabeli aspnet_Membership na 1754-01-01 12:00:00 AM. Powyższy kod wyświetla pusty ciąg w LastLockoutDateLabel, jeśli właściwość LastLockoutDate występuje przed rokiem 2000; w przeciwnym razie część daty właściwości LastLockoutDate jest wyświetlana w Labelu. Właściwość UnlockUserButtonEnabled jest ustawiona na stan zablokowania użytkownika, oznacza to, że przycisk będzie włączony tylko wtedy, gdy użytkownik jest zablokowany.

Pośmiń chwilę na przetestowanie UserInformation.aspx strony za pośrednictwem przeglądarki. Oczywiście musisz zacząć od ManageUsers.aspx i wybrać konto użytkownika do zarządzania. Po przybyciu do UserInformation.aspx należy pamiętać, że pole wyboru IsApproved jest zaznaczone tylko wtedy, gdy użytkownik jest zatwierdzony. Jeśli użytkownik kiedykolwiek został zablokowany, zostanie wyświetlona ostatnia zablokowana data. Przycisk Odblokuj użytkownika jest włączony tylko wtedy, gdy użytkownik jest obecnie zablokowany. Sprawdzanie lub usuwanie zaznaczenia IsApproved pola wyboru lub kliknięcie przycisku Odblokuj użytkownika powoduje powrót, ale żadne modyfikacje nie zostaną wprowadzone na koncie użytkownika, ponieważ nie utworzyliśmy jeszcze procedur obsługi zdarzeń dla tych zdarzeń.

Wróć do programu Visual Studio i utwórz obsługę zdarzeń dla zdarzenia CheckBoxa CheckedChanged i zdarzenia przycisku Click. W obsłudze zdarzenia CheckedChanged ustaw właściwość użytkownika IsApproved na właściwość Checked elementu CheckBox, a następnie zapisz zmiany poprzez wywołanie metody Membership.UpdateUser. W procedurze obsługi zdarzeń Click po prostu wywołaj metodę MembershipUser obiektu UnlockUser . W obu programach obsługi zdarzeń wyświetl odpowiedni komunikat w etykiecie StatusMessage .

Protected Sub IsApproved_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles IsApproved.CheckedChanged
     'Toggle the user's approved status
     Dim userName As String = Request.QueryString("user")
     Dim usr As MembershipUser = Membership.GetUser(userName)
     usr.IsApproved = IsApproved.Checked
     Membership.UpdateUser(usr)

     StatusMessage.Text = "The user's approved status has been updated."

End Sub

Protected Sub UnlockUserButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UnlockUserButton.Click
     'Unlock the user account
     Dim userName As String = Request.QueryString("user")
     Dim usr As MembershipUser = Membership.GetUser(userName)
     usr.UnlockUser()
     UnlockUserButton.Enabled = False

     StatusMessage.Text = "The user account has been unlocked."
End Sub

UserInformation.aspxTestowanie strony

Po utworzeniu tych procedur obsługi zdarzeń przejdź ponownie do strony i odrzuć użytkownika. Jak pokazano na rysunku 3, na stronie powinien zostać wyświetlony krótki komunikat wskazujący, że właściwość użytkownika IsApproved została pomyślnie zmodyfikowana.

Chris został odrzucony

Rysunek 3: Chris został niezatwierdzony (kliknij tutaj, aby wyświetlić obraz o pełnym rozmiarze)

Następnie wyloguj się i spróbuj zalogować się jako użytkownik, którego konto zostało po prostu niezatwierdzone. Ponieważ użytkownik nie jest zatwierdzony, nie może się zalogować. Domyślnie kontrolka Logowanie wyświetla ten sam komunikat, jeśli użytkownik nie może się zalogować, niezależnie od przyczyny. Ale w samouczku Weryfikowanie poświadczeń użytkownika w bazie danych członkostwa przyjrzeliśmy się ulepszeniu kontrolki logowania w celu wyświetlenia bardziej odpowiedniego komunikatu. Jak pokazano na rysunku 4, Chris jest wyświetlany komunikat wyjaśniający, że nie może się zalogować, ponieważ jego konto nie zostało jeszcze zatwierdzone.

Chris nie może zalogować się, ponieważ jego konto jest niezatwierdzone

Rysunek 4. Chris nie może zalogować się, ponieważ jego konto jest niezatwierdzone (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Aby przetestować zablokowaną funkcję, spróbuj zalogować się jako zatwierdzony użytkownik, ale użyj nieprawidłowego hasła. Powtórz ten proces przez wymaganą liczbę razy, dopóki konto użytkownika nie zostanie zablokowane. Kontrolka Logowania została również zaktualizowana w celu wyświetlenia niestandardowego komunikatu w przypadku próby zalogowania się z zablokowanego konta. Wiesz, że konto zostało zablokowane po rozpoczęciu wyświetlania następującego komunikatu na stronie logowania: "Twoje konto zostało zablokowane z powodu zbyt wielu nieprawidłowych prób logowania. Skontaktuj się z administratorem, aby odblokowano Twoje konto".

Wróć do ManageUsers.aspx strony i kliknij link Zarządzaj dla zablokowanego użytkownika. Jak pokazano na Rysunku 5, powinieneś zobaczyć wartość w polu LastLockedOutDateLabel, a przycisk Odblokuj użytkownika powinien być aktywowany. Kliknij przycisk Odblokuj użytkownika, aby odblokować konto użytkownika. Po odblokowaniu użytkownika będą oni mogli zalogować się ponownie.

Dave został zablokowany z systemu

Rysunek 5. Dave został zablokowany z systemu (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Krok 2. Określanie stanu zatwierdzonego nowego użytkownika

Zatwierdzony stan jest przydatny w scenariuszach, w których chcesz wykonać jakąś akcję, zanim nowy użytkownik będzie mógł zalogować się i uzyskać dostęp do funkcji specyficznych dla użytkownika witryny. Na przykład możesz uruchomić prywatną witrynę internetową, w której wszystkie strony, z wyjątkiem stron logowania i rejestracji, są dostępne tylko dla uwierzytelnionych użytkowników. Ale co się stanie, jeśli obcy osiągnie witrynę internetową, znajdzie stronę rejestracji i utworzy konto? Aby temu zapobiec, możesz przenieść stronę rejestracji do Administration folderu i wymagać ręcznego utworzenia każdego konta przez administratora. Alternatywnie można zezwolić każdemu użytkownikowi na rejestrację, ale uniemożliwić dostęp do witryny, dopóki administrator nie zatwierdzi konta użytkownika.

Domyślnie kontrolka CreateUserWizard zatwierdza nowe konta. To zachowanie można skonfigurować przy użyciu właściwości kontrolkiDisableCreatedUser. Ustaw tę właściwość na wartość , True aby nie zatwierdzać nowych kont użytkowników.

Uwaga / Notatka

Domyślnie kontrolka CreateUserWizard automatycznie loguje się na nowym koncie użytkownika. To zachowanie jest dyktowane przez właściwość kontrolkiLoginCreatedUser. Ponieważ niezatwierdzeni użytkownicy nie mogą zalogować się do witryny, gdy nowe konto użytkownika DisableCreatedUser nie jest True zalogowane do witryny, niezależnie od wartości właściwości LoginCreatedUser.

Jeśli programowo tworzysz nowe konta użytkowników za pomocą metody Membership.CreateUser, aby utworzyć niezatwierdzone konto użytkownika, użyj jednego z przeciążeń akceptujących wartość właściwości IsApproved nowego użytkownika jako parametr wejściowy.

Krok 3. Zatwierdzanie użytkowników przez zweryfikowanie ich adresu e-mail

Wiele witryn internetowych obsługujących konta użytkowników nie zatwierdza nowych użytkowników, dopóki nie zweryfikują adresu e-mail podanego podczas rejestrowania. Ten proces weryfikacji jest często używany do udaremnienia botów, spamerów i innych złoczyńców, ponieważ wymaga unikatowego, zweryfikowanego adresu e-mail i dodaje kolejny krok do procesu rejestracji. W przypadku tego modelu, gdy nowy użytkownik zarejestruje się, zostanie wysłana wiadomość e-mail zawierająca link do strony weryfikacji. Odwiedzając link, użytkownik udowodnił, że otrzymał wiadomość e-mail i dlatego podany adres e-mail jest prawidłowy. Strona weryfikacji jest odpowiedzialna za zatwierdzenie użytkownika. Może się to zdarzyć automatycznie, zatwierdzając w ten sposób każdego użytkownika, który dociera do tej strony, lub dopiero po udostępnieniu przez użytkownika dodatkowych informacji, takich jak CAPTCHA.

Aby dostosować się do tego przepływu pracy, należy najpierw zaktualizować stronę tworzenia konta, aby nowi użytkownicy nie zostali zatwierdzeni. EnhancedCreateUserWizard.aspx Otwórz stronę w folderze Membership i ustaw właściwość kontrolki DisableCreatedUser CreateUserWizard na True.

Następnie należy skonfigurować kontrolkę CreateUserWizard, aby wysłać wiadomość e-mail do nowego użytkownika z instrukcjami dotyczącymi weryfikowania konta. W szczególności dołączymy link w wiadomości e-mail do strony Verification.aspx (której jeszcze nie utworzyliśmy), przekazując nowego użytkownika UserId przez ciąg zapytania. Strona Verification.aspx wyszuka określonego użytkownika i oznaczy go jako zatwierdzonego.

Wysyłanie weryfikacyjnej wiadomości e-mail do nowych użytkowników

Aby wysłać wiadomość e-mail z kontrolki CreateUserWizard, należy odpowiednio skonfigurować jej MailDefinition właściwość. Zgodnie z opisem w poprzednim samouczku kontrolki ChangePassword i PasswordRecovery zawierają MailDefinition właściwość , która działa w taki sam sposób, jak kontrolka CreateUserWizard.

Uwaga / Notatka

Aby użyć MailDefinition właściwości, należy określić opcje dostarczania poczty w pliku Web.config. Aby uzyskać więcej informacji, zobacz Wysyłanie wiadomości e-mail w ASP.NET.

Zacznij od utworzenia nowego szablonu wiadomości e-mail o nazwie CreateUserWizard.txt w folderze EmailTemplates . Użyj następującego tekstu dla szablonu:

Hello <%UserName%>! Welcome aboard.

Your new account is almost ready, but before you can login you must first visit:
<%VerificationUrl%>

Once you have visited the verification URL you will be redirected to the login page.

If you have any problems or questions, please reply to this email.

Thanks!

Ustaw właściwość MailDefinitionBodyFileName na "~/EmailTemplates/CreateUserWizard.txt" oraz właściwość Subject na "Witamy na mojej stronie internetowej!" Aktywuj swoje konto".

Pamiętaj, że CreateUserWizard.txt szablon wiadomości e-mail zawiera <%VerificationUrl%> symbol zastępczy. W tym miejscu zostanie umieszczony adres URL Verification.aspx strony. Element CreateUserWizard automatycznie zastępuje symbole zastępcze <%UserName%> i <%Password%> nazwą użytkownika i hasłem nowego konta, ale nie ma wbudowanego symbolu zastępczego <%VerificationUrl%>. Musimy ręcznie zastąpić go odpowiednim adresem URL weryfikacji.

W tym celu utwórz procedurę obsługi zdarzeń dla zdarzenia CreateUserWizard SendingMail i dodaj następujący kod:

Protected Sub NewUserWizard_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles NewUserWizard.SendingMail
     'Get the UserId of the just-added user
     Dim newUser As MembershipUser = Membership.GetUser(NewUserWizard.UserName)
     Dim newUserId As Guid = CType(newUser.ProviderUserKey, Guid)

     ' Determine the full verification URL (i.e., http://yoursite.com/Verification.aspx?ID=...)
     Dim urlBase As String = Request.Url.GetLeftPart(UriPartial.Authority) & Request.ApplicationPath
     Dim verifyUrl As String = "/Verification.aspx?ID=" + newUserId.ToString()
     Dim fullUrl As String = urlBase & verifyUrl

     ' Replace <%VerificationUrl%> with the appropriate URL and querystring

     e.Message.Body = e.Message.Body.Replace("<%VerificationUrl%>", fullUrl)
End Sub

Zdarzenie SendingMail jest uruchamiane po CreatedUser zdarzeniu, co oznacza, że do czasu wykonania powyższego programu obsługi zdarzeń nowe konto użytkownika zostało już utworzone. Możemy uzyskać dostęp do wartości nowego użytkownika UserId przez wywołanie metody Membership.GetUser, przekazując wartość UserName, która została wprowadzona do kontrolki CreateUserWizard. Następnie zostanie utworzony adres URL weryfikacji. Request.Url.GetLeftPart(UriPartial.Authority) Instrukcja zwraca część adresu URL; http://yourserver.com zwraca Request.ApplicationPath ścieżkę, w której aplikacja jest zakorzeniona. Adres URL weryfikacji jest następnie zdefiniowany jako Verification.aspx?ID=userId. Te dwa ciągi są następnie łączone w celu utworzenia kompletnego adresu URL. Na koniec wszystkie wystąpienia <%VerificationUrl%> w treści wiadomości e-mail (e.Message.Body) zostały zastąpione pełnym adresem URL.

Efektem końcowym jest to, że nowi użytkownicy są nieweryfikowani, co oznacza, że nie mogą zalogować się do witryny. Ponadto wiadomości e-mail z linkiem do strony potwierdzenia wysyłane są automatycznie (zobacz Rysunek 6).

Nowy użytkownik otrzymuje wiadomość e-mail z linkiem do adresu URL weryfikacji

Rysunek 6. Nowy użytkownik otrzymuje wiadomość e-mail z linkiem do adresu URL weryfikacji (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Uwaga / Notatka

Domyślny krok kontrolki CreateUserWizard wyświetla komunikat informujący użytkownika o utworzeniu konta i pokazuje przycisk Kontynuuj. Kliknięcie tego przycisku spowoduje przejście użytkownika do adresu URL określonego przez właściwość kontrolki ContinueDestinationPageUrl . Element CreateUserWizard w systemie EnhancedCreateUserWizard.aspx jest skonfigurowany, aby kierować nowych użytkowników do ~/Membership/AdditionalUserInfo.aspx, który pyta ich o miejsce zamieszkania, adres URL strony głównej i podpis. Ponieważ te informacje mogą być dodawane tylko przez zalogowanych użytkowników, warto zaktualizować tę właściwość, aby wysyłać użytkowników z powrotem do strony głównej witryny (~/Default.aspx). Ponadto należy rozszerzyć stronę EnhancedCreateUserWizard.aspx lub krok CreateUserWizard, aby poinformować użytkownika, że został wysłany e-mail weryfikacyjny i że jego konto nie zostanie aktywowane, dopóki nie wykona instrukcji w tej wiadomości. Zostawię te modyfikacje jako ćwiczenie dla czytelnika.

Tworzenie strony weryfikacji

Naszym ostatnim zadaniem jest utworzenie Verification.aspx strony. Dodaj tę stronę do folderu głównego, kojarząc ją ze stroną wzorcową Site.master . Podobnie jak w przypadku większości poprzednich stron zawartości dodanych do witryny, usuń kontrolkę zawartości odwołującą do elementu LoginContent ContentPlaceHolder, aby strona zawartości korzystała z domyślnej zawartości strony wzorcowej.

Dodaj kontrolkę Label Web do Verification.aspx strony, ustaw jej właściwość ID jako StatusMessage i wyczyść jej właściwość tekstową. Następnie utwórz procedurę obsługi zdarzeń Page_Load i dodaj następujący kod:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     If String.IsNullOrEmpty(Request.QueryString("ID")) Then
          StatusMessage.Text = "The UserId was not included in the querystring..."
     Else
          Dim userId As Guid
          Try
               userId = New Guid(Request.QueryString("ID"))
          Catch
               StatusMessage.Text = "The UserId passed into the querystring is not in the proper format..."

               Exit Sub
          End Try

          Dim usr As MembershipUser = Membership.GetUser(userId)
          If usr Is Nothing Then
               StatusMessage.Text = "User account could not be found..."
          Else
               ' Approve the user
               usr.IsApproved = True
               Membership.UpdateUser(usr)
               StatusMessage.Text = "Your account has been approved. Please <a href=""Login.aspx"">login</a> to the site."

          End If
     End If
End Sub

Większość powyższego kodu sprawdza, czy identyfikator UserId podany za pomocą ciągu zapytania istnieje, że jest to prawidłowa Guid wartość i że odwołuje się do istniejącego konta użytkownika. Jeśli wszystkie te testy przejdą, konto użytkownika zostanie zatwierdzone; w przeciwnym razie zostanie wyświetlony odpowiedni komunikat o stanie.

Rysunek 7 przedstawia Verification.aspx stronę podczas przeglądania w przeglądarce.

Konto nowego użytkownika jest teraz zatwierdzone

Rysunek 7. Konto nowego użytkownika jest teraz zatwierdzone (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Podsumowanie

Wszystkie konta użytkowników członkostwa mają dwa stany, które określają, czy użytkownik może zalogować się do witryny: IsLockedOut i IsApproved. Obie te właściwości muszą być True, aby użytkownik mógł się zalogować.

Stan zablokowanego użytkownika jest używany jako środek zabezpieczający, aby zmniejszyć prawdopodobieństwo włamania się do witryny przez metody siłowe. W szczególności użytkownik jest zablokowany, jeśli istnieje pewna liczba nieprawidłowych prób logowania w określonym przedziale czasu. Te granice można konfigurować za pomocą ustawień dostawcy członkostwa w programie Web.config.

Stan zatwierdzony jest często używany jako środek, aby uniemożliwić nowym użytkownikom logowanie się do momentu, gdy okaże się, że wystąpiła pewna akcja. Być może witryna wymaga, aby nowe konta zostały najpierw zatwierdzone przez administratora lub, jak pokazano w kroku 3, weryfikując ich adres e-mail.

Szczęśliwe programowanie!

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 ciągu 24 godzin. Z Scottem można skontaktować się pod mitchell@4guysfromrolla.com lub poprzez jego blog pod adresem http://ScottOnWriting.NET.

Specjalne podziękowania...

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