Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
SimpleMembershipProvider является довольно гибким классом и его использовать довольно легко. Так мы можем переопределить таблицу пользователей, которая по умолчанию называется UserProfile и ее определение. Например, мы можем создать в базе данных таблицу и использовать ее в качестве хранилища данных пользователей, потому что стандартная таблица хранит только логины и id пользователей, а нам захотелось ее расширить: например, чтобы пользователь в качестве логина использовал email, а также добавить в таблицу ряд дополнительных столбцов.
Поэтому добавим в папку App_Data новую базу данных, назовем ее к примеру StoreDB и соответственно изменим строку подключения к этой бд в файле web.config, чтобы бд использовалась по умолчанию:
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename='|DataDirectory|\StoreDB.mdf';Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
Добавим в базу данных таблицу Users и создадим для нее следующее определение полей:
Далее перейдем в файл InitializeSimpleMembershipAttribute.cs и изменим строку инициализации подключения к БД в соответствии с определением нашей таблицы
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "Id", "Email", autoCreateTables: true);
Поскольку наша таблица называется Users, идентификатор пользователя содержится в столбце Id, а его логин в столбце Email.
Теперь нам надо изменить используемые по умолчанию модели, чтобы они соответствовали определению столбцов таблицы пользователей. Поэтому изменим следующие классы в файле AccoutModels.cs. Класс контекста:
public class UsersContext : DbContext { public UsersContext() : base("DefaultConnection") { } public DbSet<User> Users { get; set; } }
Класс пользователей User, который содержит данные об отдельном пользователе:
[Table("Users")] public class User { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Email { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Year { get; set; } }
Классы моделей регистрации и логина:
public class LoginModel { [Required] [Display(Name = "Адрес электронной почты")] public string Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Пароль")] public string Password { get; set; } [Display(Name = "Запомнить")] public bool RememberMe { get; set; } } public class RegisterModel { [Required] [DataType(DataType.EmailAddress)] [Display(Name = "Адрес электронной почты")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "Пароль не может быть меньше 6 и больше 100 символов", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "пароли не совпадают")] public string ConfirmPassword { get; set; } [Required] [Display(Name = "Имя")] public string FirstName { get; set; } [Required] [Display(Name = "Фамилия")] public string LastName { get; set; } [Required] [Display(Name = "Год рождения")] public int Year { get; set; } }
Теперь изменим код контроллера AccountController, чтобы он регистрировал нового пользователя должным образом:
[AllowAnonymous] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginModel model, string returnUrl) { if (ModelState.IsValid && WebSecurity.Login(model.Email, model.Password, persistCookie: model.RememberMe)) { return RedirectToLocal(returnUrl); } ModelState.AddModelError("", "Неверный пароль или логин"); return View(model); } [AllowAnonymous] public ActionResult Register() { return View(); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { try { WebSecurity.CreateUserAndAccount(model.Email, model.Password, new { FirstName=model.FirstName, LastName=model.LastName, Year=model.Year}); WebSecurity.Login(model.Email, model.Password); return RedirectToAction("Index", "Home"); } catch (MembershipCreateUserException e) { ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); } } return View(model); }
Если в случае с действием Login мы по сути просто меняем имя свойства, которое определяет логин, то в действии Register мы
также добавляем в БД переданные данные о пользователе через анонимный объект:
WebSecurity.CreateUserAndAccount(model.Email, model.Password, new { FirstName=model.FirstName, LastName=model.LastName, Year=model.Year});
И последнее, что осталось изменить - это представления логина и регистрации. Представление логина:
@model AuthInternetApplication.Models.LoginModel @{ ViewBag.Title = "Логин"; } <hgroup class="title"> <h1>@ViewBag.Title.</h1> </hgroup> <section id="loginForm"> <h2>Вход с помочью учетной записи</h2> @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) <fieldset> <ol> <li> @Html.LabelFor(m => m.Email) @Html.TextBoxFor(m => m.Email) @Html.ValidationMessageFor(m => m.Email) </li> <li> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) @Html.ValidationMessageFor(m => m.Password) </li> <li> @Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" }) </li> </ol> <input type="submit" value="Войти" /> </fieldset> <p> @Html.ActionLink("Регистрация", "Register") </p> } </section>
И представление регистрации:
@model AuthInternetApplication.Models.RegisterModel @{ ViewBag.Title = "Регистрация"; } <hgroup class="title"> <h1>@ViewBag.Title.</h1> <h2>Создание учетной записи.</h2> </hgroup> @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary() <fieldset> <legend>Форма регистрации</legend> <ol> <li> @Html.LabelFor(m => m.Email) @Html.TextBoxFor(m => m.Email) </li> <li> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) </li> <li> @Html.LabelFor(m => m.ConfirmPassword) @Html.PasswordFor(m => m.ConfirmPassword) </li> <li> @Html.LabelFor(m => m.FirstName) @Html.TextBoxFor(m => m.FirstName) </li> <li> @Html.LabelFor(m => m.LastName) @Html.TextBoxFor(m => m.LastName) </li> <li> @Html.LabelFor(m => m.Year) @Html.TextBoxFor(m => m.Year) </li> </ol> <input type="submit" value="Register" /> </fieldset> }
После запуска и регистрации пользователя со всеми данными он окажется в базе данных.