Настройка использования SimpleMembershipProvider

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

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>
}

После запуска и регистрации пользователя со всеми данными он окажется в базе данных.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850