Добавление 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
Начните с установки и запуска Visual Studio 2017.
Выберите Создать проект на начальной странице или в меню выберите Файл, а затем Новый проект.
В левой области разверните узел Visual C#, а затем выберите Интернет, а затем ASP.NET Веб-приложение (.Net Framework). Назовите проект WebFormsIdentity и нажмите кнопку ОК.
В диалоговом окне Создать проект ASP.NET выберите пустой шаблон.
Обратите внимание, что кнопка "Изменить проверку подлинности " отключена, и в этом шаблоне не предусмотрена поддержка проверки подлинности. Шаблоны веб-формы, MVC и веб-API позволяют выбрать подход к проверке подлинности.
Добавление пакетов удостоверений в приложение
В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Управление пакетами NuGet. Найдите и установите пакет Microsoft.AspNet.Identity.EntityFramework .
Обратите внимание, что этот пакет установит пакеты зависимостей : EntityFramework и Microsoft ASP.NET Identity Core.
Добавление веб-формы для регистрации пользователей
В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Добавить, а затем — Веб-форма.
В диалоговом окне Указание имени элемента присвойте новой веб-форме имя Регистрация и нажмите кнопку ОК.
Замените разметку в созданном файле 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. Приведенная выше разметка добавляет поля формы и кнопку для регистрации нового пользователя.
Откройте файл 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(); } } } }
Примечание
- Приведенный выше код представляет собой упрощенную версию файла Register.aspx.cs, которая создается при создании нового проекта ASP.NET Web Forms.
- Класс IdentityUser является реализацией по умолчанию EntityFramework интерфейса IUser . Интерфейс IUser — это минимальный интерфейс для пользователя в ASP.NET Identity Core.
- Класс UserStore является реализацией по умолчанию EntityFramework для пользовательского хранилища. Этот класс реализует минимальные интерфейсы ASP.NET Identity Core: IUserStore, IUserLoginStore, IUserClaimStore и IUserRoleStore.
- Класс UserManager предоставляет api-интерфейсы, связанные с пользователями, которые автоматически сохраняют изменения в UserStore.
- Класс IdentityResult представляет результат операции идентификации.
В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Добавить, Добавить папку ASP.NET, а затем App_Data.
Откройте файл 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
на в строке подключения.Щелкните правой кнопкой мыши файл Register.aspx в проекте и выберите пункт Задать как начальную страницу. Нажмите клавиши CTRL+F5, чтобы выполнить сборку и запуск веб-приложения. Введите новое имя пользователя и пароль, а затем нажмите кнопку Зарегистрировать.
Примечание
ASP.NET Identity поддерживает проверку, и в этом примере можно проверить поведение по умолчанию в проверяющих элементах проверки пользователей и паролей, поступающих из пакета Identity Core. Проверяющий элемент управления по умолчанию для user (
UserValidator
) имеет свойствоAllowOnlyAlphanumericUserNames
со значениемtrue
по умолчанию . Проверяющий элемент управления паролем (MinimumLengthValidator
) по умолчанию гарантирует, что пароль содержит не менее 6 символов. Эти проверяющие элементы являются свойствами,UserManager
которые можно переопределить, если вы хотите провести пользовательскую проверку.
Проверка базы данных удостоверений LocalDb и таблиц, созданных Entity Framework
В меню Вид выберите Серверная Обозреватель.
Разверните узел DefaultConnection (WebFormsIdentity), разверните узел Таблицы, щелкните правой кнопкой мыши AspNetUsers и выберите Пункт Показать данные таблицы.
Настройка приложения для проверки подлинности OWIN
На этом этапе добавлена только поддержка создания пользователей. Теперь мы продемонстрируем, как добавить проверку подлинности для входа пользователя. ASP.NET Identity использует ПО промежуточного слоя проверки подлинности Microsoft OWIN для проверки подлинности с помощью форм. Проверка подлинности файлов cookie OWIN — это механизм проверки подлинности на основе файлов cookie и утверждений, который может использоваться любой платформой, размещенной в OWIN или IIS. В этой модели одни и те же пакеты проверки подлинности можно использовать на нескольких платформах, включая ASP.NET MVC и веб-формы. Дополнительные сведения о проекте Katana и запуске ПО промежуточного слоя в независимом от узла см. в статье начало работы с проектом Katana.
Установка пакетов проверки подлинности в приложение
В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Управление пакетами NuGet. Найдите и установите пакет Microsoft.AspNet.Identity.Owin .
Найдите и установите пакет 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
В Обозреватель решений щелкните правой кнопкой мыши проект, выберите Добавить, а затем — Добавить новый элемент. В диалоговом окне поиска введите "owin". Назовите класс Startup и выберите Добавить.
В файле 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 .
Добавление веб-форм для регистрации и входа пользователей
Откройте файл 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 .
В Обозреватель решений щелкните проект правой кнопкой мыши, выберите Добавить, а затем — Веб-форма. Присвойте веб-форме имя Входа.
Замените содержимое файла 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>
Замените содержимое файла 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 .
- Теперь
Нажмите клавиши CTRL+F5 , чтобы выполнить сборку и запуск веб-приложения. Введите новое имя пользователя и пароль, а затем нажмите кнопку Зарегистрировать.
Примечание. На этом этапе создается новый пользователь и он входит в систему.Нажмите кнопку Выйти . Вы будете перенаправлены в форму Вход.
Введите недопустимое имя пользователя или пароль и нажмите кнопку Войти . Метод
UserManager.Find
вернет значение NULL и отобразится сообщение об ошибке " Недопустимое имя пользователя или пароль ".