Udostępnij za pośrednictwem


Dodawanie zabezpieczeń i członkostwa do witryny ASP.NET Web Pages (Razor)

– autor Tom FitzMacken

W tym artykule wyjaśniono, jak zabezpieczyć witrynę internetową ASP.NET Web Pages (Razor), dzięki czemu niektóre strony są dostępne tylko dla osób logujących się. (Zobaczysz również, jak tworzyć strony, do których każdy może uzyskiwać dostęp).

Czego się nauczysz:

  • Jak utworzyć witrynę internetową zawierającą stronę rejestracji i stronę logowania, aby dla niektórych stron można było ograniczyć dostęp tylko do członków.
  • Jak tworzyć strony publiczne i tylko dla członków.
  • Jak zdefiniować role, które są grupami, które mają różne uprawnienia zabezpieczeń w witrynie i jak przypisać użytkowników do roli.
  • Jak używać capTCHA, aby uniemożliwić programom zautomatyzowanym (botom) tworzenie kont członkowskich.

Oto ASP.NET funkcje wprowadzone w artykule:

  • Szablon witryny startowej programu WebMatrix.
  • Pomocnik WebSecurity i Roles klasa.
  • Pomocnik ReCaptcha .

Wersje oprogramowania używane w samouczku

  • ASP.NET Web Pages (Razor) 2
  • WebMatrix 3
  • Biblioteka pomocników sieci Web ASP.NET

Możesz skonfigurować witrynę internetową, aby użytkownicy mogli się do niej logować — czyli tak, aby witryna obsługiwała członkostwo. Może to być przydatne z wielu powodów. Na przykład witryna może zawierać strony, które powinny być dostępne tylko dla członków. W niektórych przypadkach użytkownicy mogą wymagać zalogowania się w celu wysłania opinii lub pozostawienia komentarza.

Nawet jeśli witryna internetowa obsługuje członkostwo, użytkownicy nie muszą logować się przed użyciem niektórych stron w witrynie. Użytkownicy, którzy nie są zalogowani, są znani jako użytkownicy anonimowi.

Użytkownik może zarejestrować się w witrynie internetowej, a następnie zalogować się do witryny. Witryna sieci Web wymaga nazwy użytkownika (adresu e-mail) i hasła, aby potwierdzić, że użytkownicy są tym, którzy twierdzą, że są. Ten proces logowania i potwierdzania tożsamości użytkownika jest nazywany uwierzytelnianiem.

Zabezpieczenia i członkostwo można skonfigurować na różne sposoby:

  • Jeśli używasz programu WebMatrix, łatwym sposobem jest utworzenie nowej witryny na podstawie szablonu witryny początkowej . Ten szablon jest już skonfigurowany pod kątem zabezpieczeń i członkostwa i ma już stronę rejestracji, stronę logowania itd.

    Witryna utworzona przez szablon ma również możliwość umożliwiania użytkownikom logowania się przy użyciu witryny zewnętrznej, takiej jak Facebook, Google lub Twitter.

  • Jeśli chcesz dodać zabezpieczenia do istniejącej witryny lub jeśli nie chcesz używać szablonu witryny początkowej , możesz utworzyć własną stronę rejestracji, stronę logowania itd.

Ten artykuł koncentruje się na pierwszej opcji — sposobie dodawania zabezpieczeń przy użyciu szablonu witryny początkowej . Zawiera on również podstawowe informacje na temat implementowania własnych zabezpieczeń, a następnie zawiera linki do dodatkowych informacji na temat tego, jak to zrobić. Istnieją również informacje na temat włączania identyfikatorów logowania zewnętrznego, które opisano bardziej szczegółowo w osobnym artykule.

Tworzenie zabezpieczeń witryny internetowej przy użyciu szablonu witryny początkowej

W programie WebMatrix możesz użyć szablonu witryny początkowej , aby utworzyć witrynę sieci Web zawierającą następujące elementy:

  • Baza danych używana do przechowywania nazw użytkowników i haseł dla członków.
  • Strona rejestracji, na której użytkownicy anonimowi (nowi) mogą się zarejestrować.
  • Strona logowania i wylogowywanie.
  • Strona odzyskiwania i resetowania hasła.

Poniższa procedura opisuje sposób tworzenia lokacji i konfigurowania jej.

  1. Uruchom program WebMatrix i na stronie Szybki start wybierz pozycję Witryna z szablonu.

  2. Wybierz szablon Witryny początkowej , a następnie kliknij przycisk OK. Program WebMatrix tworzy nową witrynę.

  3. W okienku po lewej stronie kliknij selektor obszaru roboczego Pliki .

  4. W folderze głównym witryny internetowej otwórz plik _AppStart.cshtml , który jest specjalnym plikiem używanym do przechowywania ustawień globalnych. Zawiera on niektóre instrukcje, które są oznaczane za pomocą // znaków:

    //WebMail.SmtpServer = "mailserver.example.com";
    //WebMail.EnableSsl = true;
    //WebMail.UserName = "username@example.com";
    //WebMail.Password = "your-password";
    //WebMail.From = "your-name-here@example.com";
    

    Te instrukcje konfigurują WebMail pomocnika, który może służyć do wysyłania wiadomości e-mail. System członkostwa może używać poczty e-mail do wysyłania wiadomości potwierdzenia podczas rejestrowania użytkowników lub zmiany haseł. (Na przykład po zarejestrowaniu się użytkowników otrzymują wiadomość e-mail zawierającą link, który można kliknąć, aby zakończyć proces rejestracji).

    Wysyłanie wiadomości e-mail wymaga dostępu do serwera SMTP zgodnie z opisem w temacie Dodawanie Email do witryny ASP.NET Web Pages. Ustawienia poczty e-mail będą przechowywane w tym centralnym pliku _AppStart.cshtml , aby nie trzeba było kodować ich wielokrotnie na każdej stronie, na której można wysyłać wiadomości e-mail. (Nie musisz konfigurować ustawień PROTOKOŁU SMTP w celu skonfigurowania bazy danych rejestracji. Ustawienia SMTP są potrzebne tylko wtedy, gdy chcesz zweryfikować użytkowników z aliasu poczty e-mail i pozwolić użytkownikom na zresetowanie zapomnianego hasła).

  5. Usuń komentarz z instrukcji, usuwając // je przed każdym z nich.

    Jeśli nie chcesz konfigurować potwierdzenia wiadomości e-mail, możesz pominąć ten krok i następny krok. Jeśli wartości SMTP nie są ustawione, nowe konto jest natychmiast dostępne bez wiadomości e-mail z potwierdzeniem.

  6. Zmodyfikuj następujące ustawienia związane z pocztą e-mail w kodzie:

    • Ustaw WebMail.SmtpServer nazwę serwera SMTP, do którego masz dostęp.

    • Pozostaw WebMail.EnableSsl wartość .true To ustawienie zabezpiecza poświadczenia wysyłane do serwera SMTP przez ich szyfrowanie.

    • Ustaw WebMail.UserName wartość na nazwę użytkownika dla konta serwera SMTP.

    • Ustaw WebMail.Password hasło dla konta serwera SMTP.

    • Ustaw WebMail.From na własny adres e-mail. Jest to adres e-mail, z którego jest wysyłana wiadomość.

      Uwaga

      Wskazówka Aby uzyskać dodatkowe informacje o wartościach tych właściwości, zobacz Konfigurowanie ustawień Email w temacie Dostosowywanie zachowania Site-Wide dla stron sieci Web ASP.NET.

  7. Zapisz i zamknij plik _AppStart.cshtml.

  8. Uruchom stronę Default.cshtml w przeglądarce.

    członkostwo w zabezpieczeniach — 2

    Uwaga

    Jeśli zostanie wyświetlony błąd z komunikatem o tym, że właściwość musi być wystąpieniem ExtendedMembershipProviderprogramu , witryna może nie zostać skonfigurowana do używania systemu członkostwa ASP.NET Web Pages (SimpleMembership). Czasami może się to zdarzyć, jeśli serwer dostawcy hostingu jest skonfigurowany inaczej niż serwer lokalny. Aby rozwiązać ten problem, dodaj następujący element do pliku Web.config witryny:

    <appSettings>
        <add key="enableSimpleMembership" value="true" />
    </appSettings>
    

    Dodaj ten element jako element podrzędny <configuration> elementu i jako element równorzędny <system.web> elementu.

  9. W prawym górnym rogu strony kliknij link Zarejestruj . Zostanie wyświetlona strona Register.cshtml .

  10. Wprowadź nazwę użytkownika i hasło, a następnie kliknij przycisk Zarejestruj.

    członkostwo w zabezpieczeniach — 3

    Podczas tworzenia witryny internetowej na podstawie szablonu witryny początkowej baza danych o nazwie StarterSite.sdf została utworzona w folderze App_Data witryny. Podczas rejestracji informacje o użytkowniku są dodawane do bazy danych. Jeśli ustawisz wartości SMTP, wiadomość zostanie wysłana na użyty adres e-mail, aby można było zakończyć rejestrację.

    członkostwo w zabezpieczeniach — 4

  11. Przejdź do programu poczty e-mail i znajdź wiadomość, która będzie zawierać kod potwierdzenia i hiperlink do witryny.

  12. Kliknij hiperlink, aby aktywować konto. Hiperlink potwierdzenia otwiera stronę potwierdzenia rejestracji.

    security-membership-5

  13. Kliknij link Zaloguj się, a następnie zaloguj się przy użyciu zarejestrowanego konta.

    Po zalogowaniu linki Login i Register zostaną zastąpione linkiem Wyloguj . Nazwa logowania jest wyświetlana jako link. (Link umożliwia przejście do strony, na której można zmienić hasło).

    członkostwo w zabezpieczeniach —6

    Uwaga

    Domyślnie ASP.NET strony internetowe wysyłają poświadczenia do serwera w postaci zwykłego tekstu (jako tekst czytelny dla człowieka). W lokacji produkcyjnej należy użyć bezpiecznego protokołu HTTP (https://, znanego również jako secure sockets layer lub SSL), aby szyfrować poufne informacje wymieniane z serwerem. Wiadomości e-mail można wysyłać przy użyciu protokołu SSL, ustawiając je WebMail.EnableSsl=true tak jak w poprzednim przykładzie. Aby uzyskać więcej informacji na temat protokołu SSL, zobacz Zabezpieczanie komunikacji internetowej: certyfikaty, protokół SSL i https://.

Dodatkowe funkcje członkostwa w witrynie

Witryna zawiera inne funkcje, które umożliwiają użytkownikom zarządzanie kontami. Użytkownicy mogą wykonywać następujące czynności:

  • Zmień swoje hasła. Po zalogowaniu mogą kliknąć nazwę użytkownika (czyli link). Spowoduje to przejście na stronę, na której można utworzyć nowe hasło (Account/ChangePassword.cshtml).
  • Odzyskaj zapomniane hasło. Na stronie logowania znajduje się link (Czy nie pamiętasz hasła?), który przenosi użytkowników na stronę (Account/ForgotPassword.cshtml), gdzie mogą wprowadzić adres e-mail. Witryna wysyła do nich wiadomość e-mail z linkiem, który może kliknąć, aby ustawić nowe hasło (Account/PasswordReset.cshtml).

Możesz również zezwolić użytkownikom na logowanie się przy użyciu witryny zewnętrznej, jak wyjaśniono później.

Tworzenie strony Members-Only

Na razie każda osoba może przejść do dowolnej strony w witrynie internetowej. Możesz jednak mieć strony, które są dostępne tylko dla osób, które się zalogowały (czyli do członków). ASP.NET umożliwia tworzenie stron, do których można uzyskiwać dostęp tylko przez zalogowanych członków. Zazwyczaj jeśli użytkownicy anonimowi próbują uzyskać dostęp do strony tylko członkowie, nastąpi przekierowanie ich do strony logowania.

W tej procedurze utworzysz folder, który będzie zawierać strony dostępne tylko dla zalogowanych użytkowników.

  1. W katalogu głównym witryny utwórz nowy folder. (Na wstążce kliknij strzałkę poniżej pozycji Nowy , a następnie wybierz pozycję Nowy folder).

  2. Nazwij nowy folder Członkowie.

  3. W folderze Członkowie utwórz nową stronę i nadaj jej nazwę MembersInformation.cshtml.

  4. Zastąp istniejącą zawartość następującym kodem i znacznikami:

    @{
        if (!WebSecurity.IsAuthenticated) {
            Response.Redirect("~/Account/Login?returnUrl="
                + Request.Url.LocalPath);
        }
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Members Information";
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>Members Information</title>
      </head>
      <body>
        <p>You can only see this information if you've logged into the site.</p>
      </body>
    </html>
    

    Ten kod sprawdza IsAuthenticated właściwość WebSecurity obiektu, która zwraca wartość true , jeśli użytkownik się zalogował. Jeśli użytkownik nie jest zalogowany, wywołania Response.Redirect kodu w celu wysłania użytkownika do strony Login.cshtml w folderze Konto .

    Adres URL przekierowania zawiera returnUrl wartość ciągu zapytania, która jest używana Request.Url.LocalPath do ustawienia ścieżki bieżącej strony. Jeśli ustawisz returnUrl wartość w ciągu zapytania w następujący sposób (i jeśli zwracany adres URL jest ścieżką lokalną), strona logowania zwróci użytkowników do tej strony po zalogowaniu.

    Kod ustawia również stronę _SiteLayout.cshtml jako stronę układu. (Aby uzyskać więcej informacji na temat stron układu, zobacz Tworzenie spójnego układu w witrynach stron internetowych ASP.NET).

  5. Uruchom witrynę. Jeśli nadal się zalogowano, kliknij przycisk Wyloguj w górnej części strony.

  6. W przeglądarce zażądaj strony /Członkowie/CzłonkowieInformation. Na przykład adres URL może wyglądać następująco:

    http://localhost:38366/Members/MembersInformation

    (Numer portu (38366) prawdopodobnie będzie inny w adresie URL).

    Nastąpi przekierowanie do strony Login.cshtml , ponieważ nie zalogowano się.

  7. Zaloguj się przy użyciu utworzonego wcześniej konta. Nastąpi przekierowanie z powrotem do strony CzłonkowieInformacja . Ponieważ zalogowano się, tym razem zobaczysz zawartość strony.

Aby zabezpieczyć dostęp do wielu stron, możesz to zrobić:

  • Dodaj kontrolę zabezpieczeń do każdej strony.
  • Utwórz stronę _PageStart.cshtml w folderze, w którym są chronione strony, i dodaj tam sprawdzanie zabezpieczeń. Strona _PageStart.cshtml działa jako rodzaj strony globalnej dla wszystkich stron w folderze. Ta technika jest bardziej szczegółowo objaśniona w temacie Dostosowywanie zachowania Site-Wide dla stron sieci Web ASP.NET.

Tworzenie zabezpieczeń dla grup użytkowników (ról)

Jeśli witryna ma wielu członków, nie jest wydajna, aby sprawdzić uprawnienia dla każdego użytkownika indywidualnie przed zezwoleniem im na wyświetlanie strony. Zamiast tego możesz utworzyć grupy lub role, do których należą poszczególne elementy członkowskie. Następnie możesz sprawdzić uprawnienia na podstawie roli. W tej sekcji utworzysz rolę "administrator", a następnie utworzysz stronę dostępną dla użytkowników, którzy należą do tej roli.

System członkostwa ASP.NET jest skonfigurowany do obsługi ról. Jednak w przeciwieństwie do rejestracji członkostwa i logowania szablon witryny początkowej nie zawiera stron, które ułatwiają zarządzanie rolami. (Zarządzanie rolami to zadanie administracyjne, a nie zadanie użytkownika). Można jednak dodawać grupy bezpośrednio w bazie danych członkostwa w programie WebMatrix.

  1. W programie WebMatrix kliknij selektor obszaru roboczego Bazy danych .

  2. W okienku po lewej stronie otwórz węzeł StarterSite.sdf , otwórz węzeł Tabele , a następnie kliknij dwukrotnie tabelę webpages_Roles .

    członkostwo w zabezpieczeniach — 7

  3. Dodaj rolę o nazwie "admin". Pole RoleId jest wypełniane automatycznie. (Jest to klucz podstawowy i został ustawiony jako pole identyfikacji, jak wyjaśniono w temacie Wprowadzenie do pracy z bazą danych w witrynach ASP.NET Stron sieci Web).

  4. Zanotuj wartość pola RoleId . (Jeśli jest to pierwsza rola, którą definiujesz, będzie to 1).

    security-membership-8

  5. Zamknij tabelę webpages_Roles .

  6. Otwórz tabelę UserProfile .

  7. Zanotuj wartość UserId co najmniej jednego użytkownika w tabeli, a następnie zamknij tabelę.

  8. Otwórz tabelę webpages_UserInRoles i wprowadź wartość UserID i RoleID w tabeli. Aby na przykład umieścić użytkownika 2 w roli "admin", należy wprowadzić następujące wartości:

    security-membership-9

  9. Zamknij tabelę webpages_UsersInRoles .

    Po zdefiniowaniu ról możesz skonfigurować stronę dostępną dla użytkowników, którzy są w tej roli.

  10. W folderze głównym witryny internetowej utwórz nową stronę o nazwie AdminError.cshtml i zastąp istniejącą zawartość następującym kodem. Będzie to strona, do której użytkownicy są przekierowywani, jeśli nie mogą uzyskać dostępu do strony.

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Admin-only Error";
    }
    <p>You must log in as an admin to access that page.</p>
    
  11. W folderze głównym witryny internetowej utwórz nową stronę o nazwie AdminOnly.cshtml i zastąp istniejący kod następującym kodem:

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Administrators only";
    }
    
    @if ( Roles.IsUserInRole("admin")) {
        <span> Welcome <b>@WebSecurity.CurrentUserName</b>! </span>
    }
    else {
         Response.Redirect("~/AdminError");
    }
    

    Metoda Roles.IsUserInRole zwraca, true jeśli bieżący użytkownik jest członkiem określonej roli (w tym przypadku rola "administrator").

  12. Uruchom plik Default.cshtml w przeglądarce, ale nie loguj się. (Jeśli już się zalogowano, wyloguj się).

  13. Na pasku adresu przeglądarki dodaj pozycję AdminOnly w adresie URL. (Innymi słowy, zażądaj pliku AdminOnly.cshtml ). Nastąpi przekierowanie do strony AdminError.cshtml , ponieważ nie jesteś obecnie zalogowany jako użytkownik w roli "admin".

  14. Wróć do pliku Default.cshtml i zaloguj się jako użytkownik dodany do roli "admin".

  15. Przejdź do strony AdminOnly.cshtml . Tym razem zostanie wyświetlona strona.

Zapobieganie dołączaniu zautomatyzowanych programów do witryny internetowej

Strona logowania nie zatrzyma zautomatyzowanych programów (czasami nazywanych robotami internetowymi lub botami) podczas rejestrowania się w witrynie internetowej. W tej procedurze opisano sposób włączania testu ReCaptcha dla strony rejestracji.

/media/38777/ch16securitymembership-18.jpg

  1. Zarejestruj swoją witrynę internetową w usłudze ReCaptcha. Po zakończeniu rejestracji otrzymasz klucz publiczny i klucz prywatny.

  2. Dodaj bibliotekę pomocników sieci Web ASP.NET do witryny sieci Web zgodnie z opisem w temacie Instalowanie pomocników w witrynie ASP.NET stron sieci Web, jeśli jeszcze tego nie zrobiono.

  3. W folderze Konto otwórz plik o nazwie Register.cshtml.

  4. W kodzie u góry strony znajdź następujące wiersze i usuń komentarz, usuwając znaki komentarza // :

    if (!ReCaptcha.Validate("PRIVATE_KEY")) {
        ModelState.AddError("recaptcha", "Captcha response was not correct");
    }
    
  5. Zastąp PRIVATE_KEY element własnym kluczem prywatnym ReCaptcha.

  6. W znacznikach strony usuń @* znaki z komentarzami i *@ wokół następujących wierszy w znacznikach strony:

    @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white")
    @Html.ValidationMessage("recaptcha")
    
  7. Zastąp element PUBLIC_KEY swoim kluczem.

  8. Jeśli jeszcze go nie usunięto, usuń <div> element zawierający tekst rozpoczynający się od "Aby włączyć weryfikację CAPTCHA...". (Usuń cały <div> element i jego zawartość).

  9. Uruchom plik Default.cshtml w przeglądarce. Jeśli zalogowano się do witryny, kliknij link Wyloguj .

  10. Kliknij link Zarejestruj i przetestuj rejestrację przy użyciu testu CAPTCHA.

    security-membership-10

Aby uzyskać więcej informacji na temat ReCaptcha pomocnika, zobacz Using a CATPCHA to Prevent Automated Programs (Bots) from Using your ASP.NET Web Site (Using a CATPCHA to Prevent Automated Programs (Boty) from Using the ASP.NET Web Site (Korzystanie z usługi CATPCHA w celu zapobiegania automatycznym programom (botom).

Zezwalanie użytkownikom na logowanie przy użyciu witryny zewnętrznej

Szablon witryny początkowej zawiera kod i znaczniki, które umożliwiają użytkownikom logowanie się przy użyciu serwisu Facebook, Windows Live, Twitter, Google lub Yahoo. Domyślnie ta funkcja nie jest włączona. Ogólna procedura korzystania z zezwalania użytkownikom na logowanie się przy użyciu tych dostawców zewnętrznych jest następująca:

  • Zdecyduj, które witryny zewnętrzne mają być obsługiwane.
  • W razie potrzeby przejdź do tej witryny i skonfiguruj aplikację logowania. (Na przykład należy to zrobić, aby zezwolić na logowanie do serwisu Facebook).
  • W witrynie skonfiguruj dostawcę. W większości przypadków wystarczy usunąć komentarz w pliku _AppStart.cshtml .
  • Dodaj znaczniki do strony rejestracji, która umożliwia użytkownikom łączenie się z witryną zewnętrzną w celu zalogowania się. Zwykle można skopiować potrzebny znacznik i nieznacznie zmienić tekst.

Instrukcje krok po kroku można znaleźć w temacie Włączanie logowania z witryn zewnętrznych w witrynie ASP.NET stron sieci Web.

Gdy użytkownik zaloguje się z innej witryny, użytkownik wróci do witryny i skojarzy ten identyfikator logowania z witryną. W efekcie spowoduje to utworzenie wpisu członkostwa w witrynie dla zewnętrznego logowania użytkownika. Umożliwia to korzystanie z normalnych obiektów członkostwa (takich jak role) z identyfikatorem logowania zewnętrznego.

Dodawanie zabezpieczeń do istniejącej witryny internetowej

Procedura wcześniej w tym artykule opiera się na użyciu szablonu witryny początkowej jako podstawy zabezpieczeń witryny internetowej. Jeśli nie jest to praktyczne rozwiązanie, aby rozpocząć od szablonu witryny początkowej lub skopiować odpowiednie strony z witryny opartej na tym szablonie, możesz zaimplementować ten sam typ zabezpieczeń we własnej witrynie, kodując ją samodzielnie. Możesz utworzyć te same typy stron — rejestrację, logowanie itd. — a następnie użyć pomocników i klas, aby skonfigurować członkostwo.

Podstawowy proces został opisany w wpisie w blogu najbardziej podstawowym sposobem implementacji zabezpieczeń ASP.NET Razor. Większość pracy jest wykonywana przy użyciu następujących metod i właściwości WebSecurity pomocnika:

Aby zarządzać rolami, możesz użyć klas Role i Członkostwo , zgodnie z opisem w wpisie w blogu.

Dodatkowe zasoby