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


Добавление ASP.NET Identity в пустой или существующий проект веб-форм

В этом руководстве показано, как добавить ASP.NET Identity (новая система членства для ASP.NET) в приложение ASP.NET.

При создании нового проекта веб-формы или MVC в Visual Studio 2017 RTM с отдельными учетными записями Visual Studio установит все необходимые пакеты и добавит все необходимые классы. В этом руководстве описаны шаги по добавлению поддержки ASP.NET Identity в существующий проект веб-формы или новый пустой проект. Я излагаю все пакеты NuGet, необходимые для установки, и классы, которые необходимо добавить. Я рассмотрим пример веб-формы для регистрации новых пользователей и входа в систему, выделяя при этом все API main точек входа для управления пользователями и проверки подлинности. В этом примере будет использоваться реализация ASP.NET Identity по умолчанию для хранилища данных SQL, построенного на платформе Entity Framework. В этом руководстве мы будем использовать LocalDB для базы данных SQL.

Начало работы с удостоверением ASP.NET

  1. Начните с установки и запуска Visual Studio 2017.

  2. Выберите Создать проект на начальной странице или в меню выберите Файл, а затем Новый проект.

  3. В левой области разверните узел Visual C#, а затем выберите Интернет, а затем ASP.NET Веб-приложение (.Net Framework). Назовите проект WebFormsIdentity и нажмите кнопку ОК.

    Изображение, отображающее создание нового проекта

  4. В диалоговом окне Создать проект ASP.NET выберите пустой шаблон.

    Диалоговое окно создания проекта точки S P N E T

    Обратите внимание, что кнопка "Изменить проверку подлинности " отключена, и в этом шаблоне не предусмотрена поддержка проверки подлинности. Шаблоны веб-формы, MVC и веб-API позволяют выбрать подход к проверке подлинности.

Добавление пакетов удостоверений в приложение

В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Управление пакетами NuGet. Найдите и установите пакет Microsoft.AspNet.Identity.EntityFramework .

Изображение, иллюстрирующая доступ к управлению пакетами Nu Get

Обратите внимание, что этот пакет установит пакеты зависимостей : EntityFramework и Microsoft ASP.NET Identity Core.

Добавление веб-формы для регистрации пользователей

  1. В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Добавить, а затем — Веб-форма.

    Изображение, показывающее, как добавить веб-форму зарегистрированным пользователям

  2. В диалоговом окне Указание имени элемента присвойте новой веб-форме имя Регистрация и нажмите кнопку ОК.

  3. Замените разметку в созданном файле Register.aspx приведенным ниже кодом. Изменения в коде выделены.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="WebFormsIdentity.Register" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
        <form id="form1" runat="server">
        <div>
            <h4 style="font-size: medium">Register a new user</h4>
            <hr />
            <p>
                <asp:Literal runat="server" ID="StatusMessage" />
            </p>                
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="UserName" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="Password" TextMode="Password" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="ConfirmPassword">Confirm password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" />                
                </div>
            </div>
            <div>
                <div>
                    <asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" />
                </div>
            </div>
        </div>
        </form>
    </body>
    </html>
    

    Примечание

    Это просто упрощенная версия файла Register.aspx, которая создается при создании нового проекта ASP.NET Web Forms. Приведенная выше разметка добавляет поля формы и кнопку для регистрации нового пользователя.

  4. Откройте файл Register.aspx.cs и замените его содержимое следующим кодом:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using System;
    using System.Linq;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
    
             var user = new IdentityUser() { UserName = UserName.Text };
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                StatusMessage.Text = string.Format("User {0} was created successfully!", user.UserName);
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Примечание

    1. Приведенный выше код представляет собой упрощенную версию файла Register.aspx.cs, которая создается при создании нового проекта ASP.NET Web Forms.
    2. Класс IdentityUser является реализацией по умолчанию EntityFramework интерфейса IUser . Интерфейс IUser — это минимальный интерфейс для пользователя в ASP.NET Identity Core.
    3. Класс UserStore является реализацией по умолчанию EntityFramework для пользовательского хранилища. Этот класс реализует минимальные интерфейсы ASP.NET Identity Core: IUserStore, IUserLoginStore, IUserClaimStore и IUserRoleStore.
    4. Класс UserManager предоставляет api-интерфейсы, связанные с пользователями, которые автоматически сохраняют изменения в UserStore.
    5. Класс IdentityResult представляет результат операции идентификации.
  5. В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Добавить, Добавить папку ASP.NET, а затем App_Data.

    Иллюстрация добавления данных приложения

  6. Откройте файл Web.config и добавьте запись строки подключения для базы данных, которую мы будем использовать для хранения сведений о пользователях. База данных будет создана во время выполнения entityFramework для сущностей Identity. Строка подключения аналогична строке, созданной при создании нового проекта веб-формы. Выделенный код показывает разметку, которые необходимо добавить:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit https://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
       <connectionStrings>
          <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebFormsIdentity.mdf;Initial Catalog=WebFormsIdentity;Integrated Security=True"
                providerName="System.Data.SqlClient" />
       </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    

    Примечание

    Для Visual Studio 2015 или более поздней версии замените на (localdb)\v11.0(localdb)\MSSQLLocalDB на в строке подключения.

  7. Щелкните правой кнопкой мыши файл Register.aspx в проекте и выберите пункт Задать как начальную страницу. Нажмите клавиши CTRL+F5, чтобы выполнить сборку и запуск веб-приложения. Введите новое имя пользователя и пароль, а затем нажмите кнопку Зарегистрировать.

    Изображение успешной регистрации нового пользователя

    Примечание

    ASP.NET Identity поддерживает проверку, и в этом примере можно проверить поведение по умолчанию в проверяющих элементах проверки пользователей и паролей, поступающих из пакета Identity Core. Проверяющий элемент управления по умолчанию для user (UserValidator) имеет свойство AllowOnlyAlphanumericUserNames со значением trueпо умолчанию . Проверяющий элемент управления паролем (MinimumLengthValidator) по умолчанию гарантирует, что пароль содержит не менее 6 символов. Эти проверяющие элементы являются свойствами, UserManager которые можно переопределить, если вы хотите провести пользовательскую проверку.

Проверка базы данных удостоверений LocalDb и таблиц, созданных Entity Framework

  1. В меню Вид выберите Серверная Обозреватель.

    Изображение доступа к обозревателю сервера

  2. Разверните узел DefaultConnection (WebFormsIdentity), разверните узел Таблицы, щелкните правой кнопкой мыши AspNetUsers и выберите Пункт Показать данные таблицы.

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

Настройка приложения для проверки подлинности OWIN

На этом этапе добавлена только поддержка создания пользователей. Теперь мы продемонстрируем, как добавить проверку подлинности для входа пользователя. ASP.NET Identity использует ПО промежуточного слоя проверки подлинности Microsoft OWIN для проверки подлинности с помощью форм. Проверка подлинности файлов cookie OWIN — это механизм проверки подлинности на основе файлов cookie и утверждений, который может использоваться любой платформой, размещенной в OWIN или IIS. В этой модели одни и те же пакеты проверки подлинности можно использовать на нескольких платформах, включая ASP.NET MVC и веб-формы. Дополнительные сведения о проекте Katana и запуске ПО промежуточного слоя в независимом от узла см. в статье начало работы с проектом Katana.

Установка пакетов проверки подлинности в приложение

  1. В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Управление пакетами NuGet. Найдите и установите пакет Microsoft.AspNet.Identity.Owin .

    Изображение диспетчера пакетов Nu Get

  2. Найдите и установите пакет Microsoft.Owin.Host.SystemWeb .

    Примечание

    Пакет Microsoft.Aspnet.Identity.Owin содержит набор классов расширений OWIN для управления и настройки ПО промежуточного слоя для проверки подлинности OWIN для использования пакетами ASP.NET Identity Core. Пакет Microsoft.Owin.Host.SystemWeb содержит сервер OWIN, который позволяет приложениям на основе OWIN выполняться в службах IIS с помощью конвейера запросов ASP.NET. Дополнительные сведения см. в разделе ПО промежуточного слоя OWIN в интегрированном конвейере IIS.

Добавление классов конфигурации запуска И проверки подлинности OWIN

  1. В Обозреватель решений щелкните правой кнопкой мыши проект, выберите Добавить, а затем — Добавить новый элемент. В диалоговом окне поиска введите "owin". Назовите класс Startup и выберите Добавить.

    Изображение окна добавления нового элемента

  2. В файле Startup.cs добавьте выделенный код, показанный ниже, чтобы настроить проверку подлинности OWIN с помощью файлов cookie.

    using Microsoft.AspNet.Identity;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.Cookies;
    using Owin;
    
    [assembly: OwinStartup(typeof(WebFormsIdentity.Startup))]
    
    namespace WebFormsIdentity
    {
       public class Startup
       {
          public void Configuration(IAppBuilder app)
          {
             // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888
             app.UseCookieAuthentication(new CookieAuthenticationOptions
             {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Login")
             });
          }
       }
    }
    

    Примечание

    Этот класс содержит OwinStartup атрибут для указания класса запуска OWIN. Каждое приложение OWIN имеет класс запуска, в котором указываются компоненты для конвейера приложения. Дополнительные сведения об этой модели см. в разделе Обнаружение классов запуска OWIN .

Добавление веб-форм для регистрации и входа пользователей

  1. Откройте файл Register.aspx.cs и добавьте следующий код, который выполняет вход пользователя при успешной регистрации.

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Linq;
    using System.Web;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
             var user = new IdentityUser() { UserName = UserName.Text };
    
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
                authenticationManager.SignIn(new AuthenticationProperties() { }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Примечание

    • Так как ASP.NET Identity и OWIN Cookie Authentication являются системой на основе утверждений, платформа требует от разработчика приложения создать ClaimsIdentity для пользователя. ClaimsIdentity содержит сведения обо всех утверждениях пользователя, например о ролях, к которому принадлежит пользователь. На этом этапе можно также добавить дополнительные утверждения для пользователя.
    • Вы можете войти в систему пользователя с помощью AuthenticationManager из OWIN и вызова SignIn и передачи ClaimsIdentity, как показано выше. Этот код выполнит вход пользователя и создаст файл cookie. Этот вызов аналогилен методу FormAuthentication.SetAuthCookie , используемому модулем FormsAuthentication .
  2. В Обозреватель решений щелкните проект правой кнопкой мыши, выберите Добавить, а затем — Веб-форма. Присвойте веб-форме имя Входа.

    Изображение, добавляя новую веб-форму

  3. Замените содержимое файла Login.aspx следующим кодом:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebFormsIdentity.Login" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
       <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
       <form id="form1" runat="server">
          <div>
             <h4 style="font-size: medium">Log In</h4>
             <hr />
             <asp:PlaceHolder runat="server" ID="LoginStatus" Visible="false">
                <p>
                   <asp:Literal runat="server" ID="StatusText" />
                </p>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LoginForm" Visible="false">
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="UserName" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="Password" TextMode="Password" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <div>
                      <asp:Button runat="server" OnClick="SignIn" Text="Log in" />
                   </div>
                </div>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LogoutButton" Visible="false">
                <div>
                   <div>
                      <asp:Button runat="server" OnClick="SignOut" Text="Log out" />
                   </div>
                </div>
             </asp:PlaceHolder>
          </div>
       </form>
    </body>
    </html>
    
  4. Замените содержимое файла Login.aspx.cs следующим кодом:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Web;
    using System.Web.UI.WebControls;
    
    namespace WebFormsIdentity
    {
       public partial class Login : System.Web.UI.Page
       {
          protected void Page_Load(object sender, EventArgs e)
          {
             if (!IsPostBack)
             {
                if (User.Identity.IsAuthenticated)
                {
                   StatusText.Text = string.Format("Hello {0}!!", User.Identity.GetUserName());
                   LoginStatus.Visible = true;
                   LogoutButton.Visible = true;
                }
                else
                {
                   LoginForm.Visible = true;
                }
             }
          }
    
          protected void SignIn(object sender, EventArgs e)
          {
             var userStore = new UserStore<IdentityUser>();
             var userManager = new UserManager<IdentityUser>(userStore);
             var user = userManager.Find(UserName.Text, Password.Text);
    
             if (user != null)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
    
                authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusText.Text = "Invalid username or password.";
                LoginStatus.Visible = true;
             }
          }
    
          protected void SignOut(object sender, EventArgs e)
          {
             var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
             authenticationManager.SignOut();
             Response.Redirect("~/Login.aspx");
          }
       }
    }
    

    Примечание

    • Теперь Page_Load проверяет состояние текущего пользователя и выполняет действия на основе его Context.User.Identity.IsAuthenticated состояния. Отображение имени пользователя, вошедшего в систему . Платформа удостоверений Microsoft ASP.NET добавила методы расширения в System.Security.Principal.IIdentity , которые позволяют получить UserName и UserId для вошедшего в систему пользователя. Эти методы расширения определяются в сборке Microsoft.AspNet.Identity.Core . Эти методы расширения заменяют HttpContext.User.Identity.Name .
    • Метод SignIn: This заменяет предыдущий CreateUser_Click метод в этом примере и теперь выполняет вход пользователя после успешного создания пользователя.
      Microsoft OWIN Framework добавила методы расширения в System.Web.HttpContext , что позволяет получить ссылку IOwinContextна . Эти методы расширения определяются в сборке Microsoft.Owin.Host.SystemWeb . Класс OwinContext предоставляет IAuthenticationManager свойство , представляющее функциональные возможности ПО промежуточного слоя проверки подлинности, доступные в текущем запросе. Вы можете войти в систему пользователя, используя AuthenticationManager из OWIN и вызвав SignIn и передав , ClaimsIdentity как показано выше. Так как ASP.NET Identity и OWIN Cookie Authentication являются системой на основе утверждений, платформа требует, чтобы приложение создавало ClaimsIdentity для пользователя. Содержит ClaimsIdentity сведения обо всех утверждениях для пользователя, например о ролях, к которому принадлежит пользователь. На этом этапе вы также можете добавить дополнительные утверждения для пользователя. Этот код также выполнит вход пользователя и создаст файл cookie. Этот вызов аналогилен методу FormAuthentication.SetAuthCookie , используемому модулем FormsAuthentication .
    • SignOut method: получает ссылку AuthenticationManager на из OWIN и вызывает SignOut. Это аналогично методу FormsAuthentication.SignOut , используемому модулем FormsAuthentication .
  5. Нажмите клавиши CTRL+F5 , чтобы выполнить сборку и запуск веб-приложения. Введите новое имя пользователя и пароль, а затем нажмите кнопку Зарегистрировать.

    Изображение новой регистрации usr
    Примечание. На этом этапе создается новый пользователь и он входит в систему.

  6. Нажмите кнопку Выйти . Вы будете перенаправлены в форму Вход.

  7. Введите недопустимое имя пользователя или пароль и нажмите кнопку Войти . Метод UserManager.Find вернет значение NULL и отобразится сообщение об ошибке " Недопустимое имя пользователя или пароль ".

    Изображение недопустимой попытки входа