Odblokowywanie i zatwierdzanie kont użytkowników (VB)
Uwaga
Ponieważ ten artykuł został napisany, dostawcy ASP.NET członkostwa zostały zastąpione przez usługę ASP.NET Identity. Zdecydowanie zalecamy aktualizowanie aplikacji w celu korzystania z platformy ASP.NET Identity , a nie dostawców członkostwa opisanych w tym artykule. ASP.NET Identity ma wiele zalet w systemie 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.
Wprowadzenie
Wraz z nazwą użytkownika, hasłem i pocztą 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 zablokowany, 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). Zatwierdzony stan jest przydatny w scenariuszach, w których niektóre działania muszą się okazać, zanim nowy użytkownik będzie mógł zalogować się do witryny. 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 zawiera żadnych wbudowanych funkcji ani kontrolek sieci Web do zarządzania zablokowanymi i zatwierdzonymi stanami użytkowników, częściowo dlatego, że te decyzje muszą być obsługiwane w oparciu o lokację. Niektóre witryny mogą automatycznie zatwierdzać wszystkie nowe konta użytkowników (zachowanie domyślne). Inni mają administratora zatwierdzać nowe konta lub nie zatwierdzać użytkowników, dopóki nie odwiedzą linku wysłanego na adres e-mail podany podczas tworzenia konta. 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 Tworzenie interfejsu do wybierania jednego konta użytkownika z wielu samouczków utworzyliśmy stronę, która zawiera wszystkie konta użytkownika na stronie odfiltrowanej kontrolki GridView. Siatka wyświetla listę nazw i wiadomości e-mail każdego użytkownika, ich zatwierdzonych i zablokowanych stanów, niezależnie od tego, czy są one obecnie w trybie online, oraz wszelkie komentarze dotyczące użytkownika. Aby zarządzać stanami zatwierdzonymi i zablokowanymi przez użytkowników, możemy zmienić tę siatkę. Aby zmienić zatwierdzony stan użytkownika, administrator najpierw zlokalizować konto użytkownika, a następnie edytować odpowiedni wiersz GridView, zaznaczając lub usuń zaznaczenie zatwierdzonego pola wyboru. Alternatywnie można zarządzać zatwierdzonymi i zablokowanymi stanami za pośrednictwem oddzielnej strony ASP.NET.
Na potrzeby tego samouczka użyjemy dwóch stron ASP.NET: ManageUsers.aspx
i UserInformation.aspx
. Chodzi o to, aby ManageUsers.aspx
wyświetlić 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 zamówieniem biznesowym jest rozszerzenie kontrolki GridView w ManageUsers.aspx
, aby uwzględnić obiekt HyperLinkField, który renderuje się jako kolumna łączy. Chcemy, aby każdy link wskazywał UserInformation.aspx?user=UserName
wartość , gdzie UserName jest nazwą użytkownika do edycji.
Uwaga
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 udostępnia 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 SQL Server w celu zmiany hasła użytkownika. Ten samouczek rozpoczyna się od podstaw na UserInformation.aspx
stronie.
Dodawanie linków "Manage" do kontrolkiUserAccounts
GridView
ManageUsers.aspx
Otwórz stronę i dodaj obiekt HyperLinkField do kontrolki UserAccounts
GridView. Ustaw właściwość HyperLinkField Text
na wartość "Manage" (Zarządzanie), a jej DataNavigateUrlFormatString
DataNavigateUrlFields
właściwości i na wartość i wartość UserName
"UserInformation.aspx?user={0}", odpowiednio. Te ustawienia konfigurują pole 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ę, aby wyświetlić ManageUsers.aspx
stronę za pośrednictwem przeglądarki. 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
, natomiast link "Zarządzaj" dla Dave wskazuje na UserInformation.aspx?user=Dave
.
Rysunek 1. HiperLinkField dodaje link "Zarządzaj" dla każdego konta użytkownika (kliknij, aby wyświetlić obraz pełnowymiarowy)
Za chwilę utworzymy interfejs użytkownika i kod UserInformation.aspx
strony, 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 klasyUnlockUser
. Właściwość IsApproved
jest czytelna i zapisywalna. Aby zapisać wszelkie zmiany w tej właściwości, musimy wywołać Membership
metodę 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 będzie działać dla IsLockedOut
właściwości, ponieważ administrator nie może zablokować użytkownika, może odblokować tylko użytkownika. Odpowiedni interfejs użytkownika dla właściwości to przycisk, który po kliknięciu IsLockedOut
odblokuje konto użytkownika. Ten przycisk powinien być włączony tylko wtedy, gdy użytkownik jest zablokowany.
UserInformation.aspx
Tworzenie strony
Teraz możemy zaimplementować interfejs 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 Etykieta sieci Web do wyświetlania nazwy wybranego użytkownika. Ustaw tę etykietę
ID
naUserNameLabel
wartość i wyczyść jej właściwość Text. - Kontrolka CheckBox o nazwie
IsApproved
. Ustaw jejAutoPostBack
właściwość naTrue
. - Kontrolka Etykieta do wyświetlania ostatniej zablokowanej daty użytkownika. Nadaj tej etykiecie
LastLockedOutDateLabel
nazwę i wyczyść jejText
właściwość. - Przycisk umożliwiający odblokowanie użytkownika. Nadaj temu przyciskowi
UnlockUserButton
nazwę i ustaw jejText
właściwość na "Odblokuj użytkownika". - Kontrolka Etykieta do wyświetlania komunikatów o stanie, takich jak "Stan zatwierdzony użytkownika została zaktualizowana". Nadaj tej kontrolce
StatusMessage
nazwę , wyczyść jejText
właściwość i ustaw jejCssClass
właściwość naImportant
. (TheImportant
Klasa CSS jest definiowana wStyles.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.
Rysunek 2. Tworzenie interfejsu użytkownika dla UserInformation.aspx
(kliknij, aby wyświetlić obraz pełnowymiarowy)
Po ukończeniu interfejsu użytkownika następnym zadaniem jest ustawienie kontrolki IsApproved
CheckBox i innych kontrolek 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 upewnienia się, że jest to pierwsza wizyta na stronie, a nie kolejne postback. Następnie odczytuje nazwę użytkownika przekazaną user
przez pole querystring i pobiera informacje o tym koncie użytkownika za pośrednictwem Membership.GetUser(username)
metody . Jeśli nie podano nazwy użytkownika za pomocą ciągu zapytania lub jeśli nie można odnaleźć określonego użytkownika, administrator zostanie odesłany do ManageUsers.aspx
strony.
Wartość MembershipUser
obiektu jest następnie wyświetlana UserName
w elemecie UserNameLabel
, a IsApproved
pole wyboru jest sprawdzane na IsApproved
podstawie wartości właściwości.
Właściwość MembershipUser
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 SqlMembershipProvider
nowego konta ustawia aspnet_Membership
pole tabeli LastLockoutDate
na 1754-01-01 12:00:00 AM
. Powyższy kod wyświetla pusty ciąg w LastLockoutDateLabel
polu , jeśli LastLockoutDate
właściwość występuje przed rokiem 2000. W przeciwnym razie część LastLockoutDate
daty właściwości jest wyświetlana w etykiecie. Właściwość UnlockUserButton
"jest Enabled
ustawiona na zablokowany stan użytkownika, co oznacza, że ten przycisk zostanie włączony tylko wtedy, gdy użytkownik zostanie zablokowany.
Poświęć 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
usługi należy pamiętać, że IsApproved
pole wyboru jest sprawdzane 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 są wprowadzane na konto użytkownika, ponieważ nie utworzyliśmy jeszcze procedur obsługi zdarzeń dla tych zdarzeń.
Wróć do programu Visual Studio i utwórz programy obsługi zdarzeń dla IsApproved
zdarzenia CheckBox CheckedChanged
i UnlockUser
zdarzenia Przycisku Click
. W procedurze CheckedChanged
obsługi zdarzeń ustaw właściwość użytkownika IsApproved
na Checked
właściwość CheckBox, a następnie zapisz zmiany za pomocą wywołania metody Membership.UpdateUser
. W procedurze obsługi zdarzeń po prostu wywołaj Click
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.aspx
Testowanie strony
Po utworzeniu tych procedur obsługi zdarzeń ponownie zapoznaj się ze stroną i niezatwierdzonym użytkownikiem. 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.
Rysunek 3. Chris został niezatwierdzony (kliknij, aby wyświetlić obraz pełnowymiarowy)
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. Jednak w samouczku Weryfikowanie poświadczeń użytkownika względem magazynu użytkowników członkostwa przyjrzeliśmy się ulepszeniu kontrolki Logowania, aby wyświetlić bardziej odpowiedni komunikat. 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.
Rysunek 4. Chris nie może zalogować się, ponieważ jego konto jest niezatwierdzone (kliknij, aby wyświetlić obraz pełnowymiarowy)
Aby przetestować zablokowaną funkcjonalność, spróbuj zalogować się jako zatwierdzony użytkownik, ale użyć 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 odblokować konto".
Wróć do ManageUsers.aspx
strony i kliknij link Zarządzaj zablokowanym użytkownikiem. Jak pokazano na rysunku 5, powinna zostać wyświetlona wartość w przycisku Odblokuj LastLockedOutDateLabel
użytkownika. Kliknij przycisk Odblokuj użytkownika, aby odblokować konto użytkownika. Po odblokowaniu użytkownika będą mogli się zalogować ponownie.
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ć 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 zapobiec temu, możesz przenieść stronę rejestracji do folderu i wymagać ręcznego Administration
utworzenia każdego konta przez administratora. Alternatywnie możesz zezwolić każdemu 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ść , aby nie zatwierdzać True
nowych kont użytkowników.
Uwaga
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, jeśli DisableCreatedUser
nowe True
konto użytkownika nie jest zalogowane do witryny, niezależnie od wartości LoginCreatedUser
właściwości.
Jeśli programowo tworzysz nowe konta użytkowników za pomocą Membership.CreateUser
metody, aby utworzyć niezatwierdzone konto użytkownika, użyj jednego z przeciążeń, które akceptują wartość właściwości nowego użytkownika IsApproved
jako parametr wejściowy.
Krok 3. Zatwierdzanie użytkowników przez zweryfikowanie adresu Email
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 ne'er-do-do-wells, ponieważ wymaga unikatowego, zweryfikowanego adresu e-mail i dodaje dodatkowy krok w procesie 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 każdego użytkownika, który dociera do tej strony, lub dopiero po udostępnieniu dodatkowych informacji, takich jak CAPTCHA.
Aby uwzględnić ten przepływ pracy, musimy najpierw zaktualizować stronę tworzenia konta, aby nowi użytkownicy nie zostały 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 Verification.aspx
strony (która jeszcze została utworzona), przekazując ciąg zapytania przez nowego użytkownika UserId
. Strona Verification.aspx
będzie wyszukiwać określonego użytkownika i oznaczyć je jako zatwierdzone.
Wysyłanie Email weryfikacji do nowych użytkowników
Aby wysłać wiadomość e-mail z kontrolki CreateUserWizard, należy odpowiednio skonfigurować jej MailDefinition
właściwość. Jak wspomniano 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
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 Email 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!
MailDefinition
Ustaw właściwość "BodyFileName
~/EmailTemplates/CreateUserWizard.txt" i jej Subject
właściwość na "Witamy w mojej witrynie 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 <%UserName%>
symbole zastępcze i <%Password%>
nazwą użytkownika i hasłem nowego konta, ale nie ma wbudowanego <%VerificationUrl%>
symbolu zastępczego. Musimy ręcznie zastąpić go odpowiednim adresem URL weryfikacji.
Aby to zrobić, 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
, wywołując metodę Membership.GetUser
, przekazując UserName
wprowadzoną w kontrolce CreateUserWizard. Następnie zostanie utworzony adres URL weryfikacji. Request.Url.GetLeftPart(UriPartial.Authority)
Instrukcja zwraca http://yourserver.com
część adresu URL; Request.ApplicationPath
zwraca ś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 treść wiadomości e-mail (e.Message.Body
) zawiera wszystkie wystąpienia zastąpione <%VerificationUrl%>
pełnym adresem URL.
Efekt netto polega na tym, że nowi użytkownicy są niezatwierdzeni, co oznacza, że nie mogą zalogować się do witryny. Ponadto są one automatycznie wysyłane pocztą e-mail z linkiem do adresu URL weryfikacji (zobacz Rysunek 6).
Rysunek 6. Nowy użytkownik otrzymuje Email z linkiem do adresu URL weryfikacji (kliknij, aby wyświetlić obraz pełnowymiarowy)
Uwaga
Domyślny krok CreateUserWizard kontrolki CreateUserWizard wyświetla komunikat informujący o utworzeniu konta użytkownika i wyświetl przycisk Kontynuuj. Kliknięcie tego elementu powoduje przejście użytkownika do adresu URL określonego przez właściwość kontrolki ContinueDestinationPageUrl
. Element CreateUserWizard w EnhancedCreateUserWizard.aspx
programie jest skonfigurowany do wysyłania nowych użytkowników do ~/Membership/AdditionalUserInfo.aspx
elementu , który monituje użytkownika o podanie swojego rodzinnego miasta, adresu URL strony głównej i podpisu. 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 EnhancedCreateUserWizard.aspx
należy rozszerzyć stronę lub krok CreateUserWizard, aby poinformować użytkownika, że został wysłany weryfikacyjny adres e-mail, a ich konto nie zostanie aktywowane, dopóki nie będą postępować zgodnie z instrukcjami podanymi w tej wiadomości e-mail. Pozostawiam 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
. Jak zrobiliśmy z większością poprzednich stron zawartości dodanych do witryny, usuń kontrolkę Zawartość odwołującą LoginContent
się do elementu ContentPlaceHolder, aby strona zawartości korzystała z domyślnej zawartości strony wzorcowej.
Dodaj kontrolkę Etykieta sieci Web do Verification.aspx
strony, ustaw jej StatusMessage
ID
wartość 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 dostarczony za pomocą ciągu zapytania istnieje, że jest prawidłową wartością Guid
i 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ę odwiedzaną za pośrednictwem przeglądarki.
Rysunek 7. Konto nowego użytkownika jest teraz zatwierdzone (kliknij, aby wyświetlić obraz pełnowymiarowy)
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
przeznaczone dla użytkownika do logowania.
Zablokowany stan użytkownika jest używany jako środek bezpieczeństwa, 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 ograniczenia 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ę, dopóki niektóre działania nie zajdą. 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. Scott można dotrzeć pod mitchell@4guysfromrolla.com adresem lub za pośrednictwem swojego bloga pod adresem http://ScottOnWriting.NET.
Specjalne podziękowania...
Ta seria samouczków została przejrzyona przez wielu przydatnych recenzentów. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi linię na mitchell@4GuysFromRolla.com