Поделиться через


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

; автор — Том ФитцМакен (Tom FitzMacken)

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

Из этого руководства вы узнаете, как выполнять такие задачи:

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

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

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

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

  • веб-страницы ASP.NET (Razor) 2
  • WebMatrix 3
  • Библиотека веб-помощников ASP.NET

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Примечание

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

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

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

    security-membership-2

    Примечание

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

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

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

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

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

    security-membership-3

    При создании веб-сайта на основе шаблона начального сайта в папке App_Data сайта была создана база данных с именем StarterSite.sdf. Во время регистрации сведения о пользователе добавляются в базу данных. Если задать значения 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. В папке Members создайте страницу с именем 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 выступает в качестве глобальной страницы для всех страниц в папке. Этот способ более подробно описан в статье Настройка поведения Site-Wide для веб-страницы ASP.NET.

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

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

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

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

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

    security-membership-7

  3. Добавьте роль с именем admin. Поле RoleId заполняется автоматически. (Это первичный ключ, для которого задано поле идентификации, как описано в статье Общие сведения о работе с базой данных на сайтах веб-страницы ASP.NET.)

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

    security-membership-8

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

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

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

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

    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. В папке Account (Учетная запись ) откройте файл 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 статье Использование CATPCHA для предотвращения использования веб-сайта ASP.NET автоматических программ (ботов).

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

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

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

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

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

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

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

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

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

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