Добавление безопасности и членства в сайт веб-страниц ASP.NET (Razor)

Tom FitzMacken

В этой статье объясняется, как защитить веб-сайт на ASP.NET Web Pages (Razor), чтобы некоторые страницы были доступны только пользователям, которые вошли в систему. (Вы также узнаете, как создавать страницы, к которым может получить доступ любой пользователь.)

Что вы узнаете:

  • Как создать веб-сайт, имеющий страницу регистрации и страницу входа, чтобы для некоторых страниц можно ограничить доступ только к членам.
  • Создание общедоступных и доступных только для участников страниц.
  • Как определить роли, которые объединяются в группы с разными разрешениями безопасности на сайте, и как назначить пользователей на роль.
  • Использование CAPTCHA для предотвращения создания учетных записей участников автоматических программ (ботов).

Ниже приведены ASP.NET функции, представленные в статье:

  • Шаблон начального сайта WebMatrix.
  • Вспомогательный инструмент WebSecurity и класс Roles.
  • Помощник ReCaptcha .

Версии программного обеспечения, используемые в руководстве

  • Веб-страницы ASP.NET (Razor) 2
  • WebMatrix 3
  • Библиотека ASP.NET Web Helpers

Вы можете настроить веб-сайт, чтобы пользователи могли войти в него, то есть, чтобы сайт поддерживал членство. Это может быть полезно по многим причинам. Например, сайт может иметь страницы, которые должны быть доступны только участникам. В некоторых случаях пользователям может потребоваться войти в систему, чтобы отправить отзыв или оставить комментарий.

Даже если ваш веб-сайт поддерживает членство, пользователи не обязательно должны войти в систему, прежде чем они используют некоторые страницы на сайте. Пользователи, которые не вошли в систему, называются анонимными пользователями.

Пользователь может зарегистрировать на своем веб-сайте и затем войти на сайт. На веб-сайте требуется имя пользователя (адрес электронной почты) и пароль для подтверждения того, что пользователи являются пользователями, которые они утверждают. Этот процесс входа и подтверждения удостоверения пользователя называется проверкой подлинности.

Вы можете настроить безопасность и членство различными способами:

  • Если вы используете WebMatrix, простой способ создания нового сайта на основе шаблона Starter Site. Этот шаблон уже настроен для безопасности и членства и уже имеет страницу регистрации, страницу входа и т. д.

    Сайт, созданный шаблоном, также имеет возможность разрешить пользователям входить в систему с помощью внешнего сайта, например Facebook, Google или Twitter.

  • Если вы хотите добавить безопасность на существующий сайт или не хотите использовать шаблон начального сайта , можно создать собственную страницу регистрации, страницу входа и т. д.

В этой статье основное внимание уделяется первому варианту — добавлению безопасности с помощью шаблона начального сайта . Он также предоставляет некоторые основные сведения о том, как реализовать собственную безопасность, а затем предоставляет ссылки на дополнительные сведения о том, как это сделать. Также есть сведения о том, как включить внешние имена входа, которые подробно описаны в отдельной статье.

Создание системы безопасности веб-сайтов с помощью шаблона начального сайта

В WebMatrix можно использовать шаблон начального сайта для создания веб-сайта, содержащего следующие элементы:

  • База данных, используемая для хранения имен пользователей и паролей для участников.
  • Страница регистрации, на которой могут зарегистрировать анонимных (новых) пользователей.
  • Страница входа и выхода.
  • Страница восстановления и сброса пароля.

В следующей процедуре описывается, как создать сайт и настроить его.

  1. Запустите WebMatrix и на странице быстрого запуска выберите "Сайт из шаблона".

  2. Выберите шаблон начального сайта и нажмите кнопку "ОК". WebMatrix создает новый сайт.

  3. В левой области щелкните селектор рабочей области "Файлы ".

  4. В корневой папке веб-сайта откройте файл _AppStart.cshtml , который является специальным файлом, который используется для хранения глобальных параметров. Он содержит некоторые инструкции, которые закомментированы с помощью // символов:

    Эти инструкции настраивают вспомогательный WebMail объект, который можно использовать для отправки электронной почты. Система членства может использовать электронную почту для отправки сообщений подтверждения при регистрации пользователей или при изменении паролей. (Например, после регистрации пользователи получают сообщение электронной почты, включающее ссылку, которую они могут щелкнуть, чтобы завершить процесс регистрации.)

    Для отправки электронной почты требуется доступ к SMTP-серверу, как описано в разделе "Добавление электронной почты" на сайт веб-страниц ASP.NET. Вы будете хранить параметры электронной почты в этом центральном файле _AppStart.cshtml так, чтобы вам не приходилось снова и снова встраивать их в каждую страницу, которая отправляет электронную почту. (Вам не нужно настраивать параметры SMTP для настройки базы данных регистрации; вам нужны только параметры SMTP, если вы хотите проверить пользователей с псевдонима электронной почты и разрешить пользователям сбрасывать забытый пароль.)

  5. Раскомментируйте инструкции, удаляя // перед каждым из них.

    Если вы не хотите настроить подтверждение электронной почты, можно пропустить этот шаг и следующий шаг. Если значения SMTP не заданы, новая учетная запись сразу же доступна без подтверждения электронной почты.

  6. Измените следующие параметры, связанные с электронной почтой, в коде:

    • Задайте WebMail.SmtpServer имя SMTP-сервера, к которому у вас есть доступ.

    • Оставьте WebMail.EnableSsl в значении true. Этот параметр защищает учетные данные, отправляемые на SMTP-сервер, зашифровав их.

    • Задайте WebMail.UserName имя пользователя для учетной записи SMTP-сервера.

    • Задайте WebMail.Password пароль для учетной записи SMTP-сервера.

    • Установите WebMail.From на ваш собственный адрес электронной почты. Это адрес электронной почты, с которого отправляется сообщение.

      Замечание

      Совет Дополнительные сведения о значениях этих свойств см. в разделе Настройка параметров электронной почты в настройке поведения Site-Wide для веб-страниц ASP.NET.

  7. Сохраните и закройте файл _AppStart.cshtml.

  8. Запустите страницу Default.cshtml в браузере.

    security-membership-2

    Замечание

    Если отображается сообщение об ошибке, которое сообщает о том, что свойство должно быть экземпляром ExtendedMembershipProvider, сайт, возможно, не настроен для использования системы членства ASP.NET Web Pages (SimpleMembership). Иногда это может произойти, если сервер поставщика услуг размещения настроен не так, как локальный сервер. Чтобы устранить эту проблему, добавьте следующий элемент в файлWeb.config сайта:

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

    Добавьте этот элемент как дочерний элемент <configuration> и как элемент на одном уровне с <system.web>.

  9. В правом верхнем углу страницы щелкните ссылку "Регистрация ". Отображается страница Register.cshtml .

  10. Введите имя пользователя и пароль и нажмите кнопку "Зарегистрировать".

    security-membership-3

    При создании веб-сайта из шаблона начального сайта база данных с именем StarterSite.sdf была создана в папке App_Data сайта. Во время регистрации данные пользователя добавляются в базу данных. Если заданы значения SMTP, сообщение отправляется на адрес электронной почты, который вы использовали, чтобы завершить регистрацию.

    security-membership-4

  11. Перейдите в программу электронной почты и найдите сообщение, которое будет иметь код подтверждения и гиперссылку на сайт.

  12. Щелкните гиперссылку, чтобы активировать учетную запись. Гиперссылка на подтверждение открывает страницу подтверждения регистрации.

    security-membership-5

  13. Щелкните ссылку для входа и войдите с помощью зарегистрированной учетной записи.

    После входа ссылки входа и регистрации заменяются ссылкой выхода . Имя входа отображается в виде ссылки. (Ссылка позволяет перейти на страницу, в которой можно изменить пароль.)

    security-membership-6

    Замечание

    По умолчанию ASP.NET веб-страницы отправляют учетные данные серверу в виде понятного текста (как читаемый человеком текст). Рабочий сайт должен использовать безопасный HTTP (https://, также известный как уровень безопасных сокетов или SSL), чтобы шифровать конфиденциальную информацию, обмененную с сервером. Вы можете требовать отправку сообщений электронной почты с помощью SSL, установив WebMail.EnableSsl=true значение, как показано в предыдущем примере. Дополнительные сведения о SSL см. в разделе "Защита веб-коммуникаций": сертификаты, SSL и https://.

Дополнительные функции членства на сайте

Ваш сайт содержит другие функциональные возможности, позволяющие пользователям управлять своими учетными записями. Пользователи могут выполнять следующие действия:

  • Изменение паролей. После входа в систему он может щелкнуть имя пользователя (это ссылка). Это приведет их к странице, где они могут создать новый пароль (Account/ChangePassword.cshtml).
  • Восстановление забытого пароля. На странице входа есть ссылка (вы забыли пароль?), которая принимает пользователей на страницу (Account/ForgotPassword.cshtml), где они могут ввести адрес электронной почты. Сайт отправляет им сообщение электронной почты с ссылкой, которую они могут щелкнуть, чтобы задать новый пароль (Account/PasswordReset.cshtml).

Вы также можете разрешить пользователям выполнять вход с помощью внешнего сайта, как описано далее.

Создание страницы Members-Only

В настоящее время любой пользователь может перейти на любую страницу на вашем веб-сайте. Но вы можете иметь страницы, доступные только пользователям, вошедшим в систему (т. е. участникам). ASP.NET позволяет создавать страницы, к которым можно обращаться только с помощью участников, вошедшего в систему. Как правило, если анонимные пользователи пытаются получить доступ к странице только для участников, вы перенаправляете их на страницу входа.

В этой процедуре вы создадите папку, содержащую страницы, доступные только для пользователей, вошедшего в систему.

  1. В корне сайта создайте новую папку. (На ленте щелкните стрелку в нижней области "Создать ", а затем выберите "Создать папку".)

  2. Назовите новую папку Members.

  3. В папке "Члены" создайте новую страницу и назовите ее MembersInformation.cshtml.

  4. Замените существующее содержимое следующим кодом и разметкой:

    @{
        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>
    

    Этот код тестирует свойство IsAuthenticated объекта WebSecurity, которое возвращает true, если пользователь вошел в систему. Если пользователь не вошел в систему, код вызывается Response.Redirect для отправки пользователя на страницу Login.cshtml в папке "Учетная запись ".

    URL-адрес перенаправления включает returnUrl параметр строки запроса, который использует Request.Url.LocalPath для установки пути текущей страницы. Если в строке запроса задано значение returnUrl и URL-адрес возврата является локальным путем, то после входа пользователей на странице входа их вернут на эту страницу.

    Код также задает страницу _SiteLayout.cshtml в качестве страницы макета. (Дополнительные сведения о страницах макета см. в разделе "Создание согласованного макета" на сайтах веб-страниц ASP.NET.)

  5. Запустите сайт. Если вы все еще находитесь в системе, нажмите кнопку Выход в верхней части страницы.

  6. В браузере отправьте запрос на страницу /Members/MembersInformation. Например, URL-адрес может выглядеть следующим образом:

    http://localhost:38366/Members/MembersInformation

    (Номер порта (38366) может отличаться в URL-адресе.)

    Вы перенаправляетесь на страницу Login.cshtml , так как вы не вошли в систему.

  7. Войдите с помощью созданной ранее учетной записи. Вы перенаправляетесь обратно на страницу MembersInformation . Так как вы вошли в систему, на этот раз вы увидите содержимое страницы.

Чтобы защитить доступ к нескольким страницам, это можно сделать:

  • Добавьте проверку безопасности на каждую страницу.
  • Создайте страницу _PageStart.cshtml в папке, в которой хранятся защищенные страницы, и добавьте там проверку безопасности. Страница _PageStart.cshtml выступает в качестве глобальной страницы для всех страниц в папке. Этот метод более подробно описан в документе Настройка поведения сайта для веб-страниц ASP.NET.

Создание безопасности для групп пользователей (ролей)

Если у вашего сайта есть много участников, это не эффективно проверить разрешение для каждого пользователя по отдельности, прежде чем позволить им увидеть страницу. Вместо этого можно создать группы или роли, к которым принадлежат отдельные члены. Затем можно проверить разрешения на основе роли. В этом разделе вы создадите роль "админ", а затем создадите страницу, доступную пользователям, которые находятся в этой роли.

Система членства в ASP.NET настроена для поддержки ролей. Однако в отличие от регистрации членства и входа шаблон начального сайта не содержит страницы, помогающие управлять ролями. (Управление ролями является административной задачей, а не задачей пользователя.) Однако вы можете добавлять группы непосредственно в базу данных членства в WebMatrix.

  1. В WebMatrix щелкните селектор рабочей области "Базы данных ".

  2. В левой области откройте узел StarterSite.sdf , откройте узел "Таблицы ", а затем дважды щелкните таблицу webpages_Roles .

    security-membership-7

  3. Добавьте роль с именем "admin". Поле RoleId заполняется автоматически. (Это первичный ключ, и для него задано поле идентификатора, как описано в разделе "Введение в работу с базой данных в ASP.NET Web Pages Sites".)

  4. Запишите значение поля RoleId . (Если это первая роль, которую вы определяете, она будет 1.)

    security-membership-8

  5. Закройте таблицу webpages_Roles .

  6. Откройте таблицу UserProfile .

  7. Запишите значение UserId одного или нескольких пользователей в таблице, а затем закройте таблицу.

  8. Откройте таблицу webpages_UserInRoles и введите userID и значение RoleID в таблицу. Например, чтобы поместить пользователя 2 в роль "admin", введите следующие значения:

    security-membership-9

  9. Закройте таблицу webpages_UsersInRoles .

    Теперь, когда у вас определены роли, можно настроить страницу, доступную пользователям, которые находятся в этой роли.

  10. В корневой папке веб-сайта создайте новую страницу с именем AdminError.cshtml и замените существующее содержимое следующим кодом. Это будет страница, на которую пользователи перенаправляются, если они не имеют доступа к странице.

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Admin-only Error";
    }
    <p>You must log in as an admin to access that page.</p>
    
  11. В корневой папке веб-сайта создайте новую страницу с именем AdminOnly.cshtml и замените существующий код следующим кодом:

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

    Метод Roles.IsUserInRole возвращает true , если текущий пользователь является членом указанной роли (в данном случае роль "администратор").

  12. Запустите Default.cshtml в браузере, но не войдите в систему. (Если вы уже вошли в систему, выйдите из системы.)

  13. В адресной строке браузера добавьте AdminOnly в URL-адрес. (Другими словами, запросите файл AdminOnly.cshtml .) Вы перенаправляетесь на страницу AdminError.cshtml , так как вы не вошли в систему в качестве пользователя в роли "администратор".

  14. Вернитесь к Default.cshtml и войдите в систему в качестве пользователя, добавленного в роль администратора.

  15. Перейдите на страницу AdminOnly.cshtml . На этот раз вы увидите страницу.

Предотвращение присоединения к веб-сайту автоматических программ

Страница входа не останавливает автоматические программы (иногда называемые веб-роботами или ботами) от регистрации на веб-сайте. В этой процедуре описывается включение теста ReCaptcha для страницы регистрации.

/media/38777/ch16securitymembership-18.jpg

  1. Зарегистрируйте веб-сайт в службе ReCaptcha. После завершения регистрации вы получите открытый ключ и закрытый ключ.

  2. Добавьте библиотеку вспомогательных средств ASP.NET на ваш веб-сайт, как описано в разделе "Установка вспомогательных библиотек" на сайте веб-страниц ASP.NET, если вы еще не сделали этого.

  3. В папке "Учетная запись" откройте файл с именем Register.cshtml.

  4. В коде в верхней части страницы найдите следующие строки и раскомментируйте их, удалив // символы комментариев:

    if (!ReCaptcha.Validate("PRIVATE_KEY")) {
        ModelState.AddError("recaptcha", "Captcha response was not correct");
    }
    
  5. Замените PRIVATE_KEY собственным закрытым ключом ReCaptcha.

  6. В разметке страницы удалите символы комментария @* и *@ вокруг следующих строк.

    @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white")
    @Html.ValidationMessage("recaptcha")
    
  7. Замените PUBLIC_KEY собственным ключом.

  8. Если вы еще не удалили его, удалите <div> элемент, содержащий текст, начинающийся с "Включить проверку CAPTCHA...". (Удалите весь <div> элемент и его содержимое.)

  9. Запустите Default.cshtml в браузере. Если вы вошли на сайт, щелкните Выход.

  10. Щелкните ссылку "Регистрация " и проверьте регистрацию с помощью теста CAPTCHA.

    security-membership-10

Дополнительные сведения о вспомогательном ReCaptcha элементе см. в разделе "Использование CAPTCHA для предотвращения использования автоматизированных программ (ботов) на веб-сайте ASP.NET".

Предоставление пользователям входа с помощью внешнего сайта

Шаблон начального сайта содержит код и разметку, которая позволяет пользователям входить в систему с помощью Facebook, Windows Live, Twitter, Google или Yahoo. По умолчанию эта функция не включена. Общая процедура для предоставления пользователям возможности входить в систему с помощью этих внешних поставщиков следующая:

  • Определите, какие внешние сайты вы хотите поддерживать.
  • При необходимости перейдите на этот сайт и настройте приложение для входа. (Например, это необходимо сделать, чтобы разрешить входы в Facebook.)
  • На сайте настройте поставщика. В большинстве случаев вам просто нужно раскомментировать некоторый код в файле _AppStart.cshtml.
  • Добавьте разметку на страницу регистрации, которая позволяет пользователям ссылаться на внешний сайт для входа. Обычно можно скопировать нужную разметку и немного изменить текст.

Пошаговые инструкции см. в разделе "Включение входа с внешних сайтов" на сайте веб-страниц ASP.NET.

После входа пользователя из другого сайта пользователь возвращается на сайт и связывает его с сайтом. В действительности это создает запись членства на сайте для внешнего входа пользователя. Это позволяет использовать обычные возможности членства (например, роли) с внешней учетной записью.

Добавление безопасности на существующий веб-сайт

Процедура, описанная ранее в этой статье, использует шаблон начального сайта в качестве основы для безопасности веб-сайтов. Если вы не можете начать с шаблона начального сайта или скопировать соответствующие страницы с сайта на основе этого шаблона, вы можете реализовать тот же тип безопасности на своем сайте, закодировав его самостоятельно. Вы создаете те же типы страниц — регистрация, вход и т. д. — а затем используете вспомогательные функции и классы для настройки членства.

Базовый процесс описывается в записи блога САМЫЙ базовый способ реализации безопасности ASP.NET Razor. Большая часть работы выполняется с помощью следующих методов и свойств вспомогательного WebSecurity элемента:

Для управления ролями можно использовать классы ролей ичленства , как описано в записи блога.

Дополнительные ресурсы