Как войти в систему с помощью электронной почты вместо имени пользователя в простом членстве ASP.NET MVC 4

Я разрабатываю приложение начального уровня с ASP.NET MVC 4. Приложение будет иметь систему членства. Я хочу использовать интегрированный SimpleMembershipProvider, потому что создание нового будет для меня сложным. Таким образом, пользователи должны входить в приложение со своими адресами электронной почты, а не с именем пользователя, как в SimpleMembershipProvider. Но я не мог сделать это изменение. Единственный способ сделать это — создать моего собственного провайдера членства?


person gkonuralp    schedule 12.11.2013    source источник
comment
что мешает вам использовать электронную почту в качестве имени пользователя?   -  person Paweł Staniec    schedule 12.11.2013
comment
Прежде всего спасибо. Но я хотел бы узнать, можно ли настроить Sim.Mem.Provider. Туториалы на эту тему не для новичков, всегда что-то пропускают. Если я не могу найти способ сделать это, я обязательно сделаю это с помощью вашего метода.   -  person gkonuralp    schedule 12.11.2013


Ответы (3)


Используйте электронную почту, чтобы найти идентификатор пользователя. передать этого пользователя в членство и аутентифицировать пользователя с этим.

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

Как предотвратить дублирование электронной почты адреса, в то время как пользователи изменяют свои адреса электронной почты после регистрации с использованием поставщика членства MVC по умолчанию?

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

person JC Lizard    schedule 12.11.2013
comment
Спасибо большое. Это очень хороший способ для меня. Недостаток новичка в том, что вы не можете думать так просто. - person gkonuralp; 12.11.2013

В классе AccountModels ( Models.AccountModels ) вам необходимо обновить поле, т.е. ввести свойство электронной почты, как показано ниже.

 public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    // Make change here 
    [Required]
    [Display(Name = "Your Email")]
    public string  Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

После того, как мы получили электронное письмо, чтобы использовать электронную почту в представлении входа в систему, прежде всего измените класс LoginModel следующим образом:

    public class LoginModel
{
    [Required]
    [Display(Name = "Your Email")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

И, конечно же, электронная почта будет приниматься от пользователя при регистрации, поэтому внесите изменения в класс RegisterModel следующим образом.

Теперь у вас есть логин и регистрация обновлены. Затем фактические данные, которые в конечном итоге будут храниться в базе данных, определяются в классе UserProfile, поэтому давайте добавим к нему поле электронной почты.

    [Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email  { get; set; }
}

Теперь вы закончили с обновлением модели. Но теперь это будет работать, потому что, когда вы нажмете «Зарегистрироваться», он фактически добавит имя пользователя и пароль и будет использовать пару для аутентификации. Теперь давайте изменим его. Перейдите к Controllers.AccountController.cs, найдите следующую функцию и обновите ее. WebSecurity.CreateUserAndAccount(model.Email, model.Password); WebSecurity.Login(model.Email, model.Password);

//
    // POST: /Account/Register

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            try
            {
                WebSecurity.CreateUserAndAccount(model.Email, model.Password);
                WebSecurity.Login(model.Email, model.Password);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

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

        //
    // POST: /Account/Login

    [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);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The Email or password provided is incorrect.");
        return View(model);
    }

Это должно позволить вам использовать адрес электронной почты и пароль в качестве пары для входа.

person Mhacom Kone    schedule 26.01.2014

Простой вариант: в файле Models/AccountViewModels.cs вы найдете множество классов, содержащих такое поле:

[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }

Просто для скорости измените их на:

[Required]
[Display(Name = "Username")]
public string Email { get; set; }

И из вашего кода вы знаете, что поле Email на самом деле является именем пользователя, поэтому вам не нужно менять его везде.

person Community    schedule 13.07.2015