Имя пользователя ASP.Net для электронной почты
Я работаю с новой идентификацией ASP.NET(RTM), и мне было интересно, как я буду продолжать менять регистрацию и логин от имени пользователя к электронной почте.
Идея состоит в том, что я хочу, чтобы мои пользователи подписывались с помощью своего электронного письма и пароля (электронная почта также может быть получена с использованием внешнего входа в систему), и они настраивают отображаемое имя/имя пользователя сверху.
Я посмотрел на IdentityUser, и я вижу, что UserName существует, однако, поскольку он упакован в Identity ASP.Net, который не может быть изменен.
Я знаю, что я мог бы использовать "UserName" в качестве электронной почты с помощью специального валидатора, а затем иметь дополнительный атрибут для ApplicationUser с именем DisplayName, но это скорее хак, чем решение.
Надеюсь, мой вопрос ясен. Заранее спасибо.
Ответы
Ответ 1
Если вы действительно хотите использовать адрес электронной почты для входа в систему, то, IMHO, "взломанный", который вы предложили, является наилучшим подходом. Потому что, если вы настаиваете на "правильном выполнении", вам придется как минимум
- изменить схему базы данных, очевидно
- убедитесь в уникальности имени пользователя (вы можете сделать ограничение базы данных /index сделать это для вас, но вам нужно будет найти хороший способ справиться с ошибками и сообщить об этом пользователю)
- найти хорошую замену только для написания "User.Identity.UserName" в вашем коде
- возможно даже больше
С другой стороны, если вы решили "взломать" поле UserName, вам нужно
- изменить RegisterViewModel validation (добавить [EmailAddress] в свойство UserName), возможно, слегка настроить [Display (Name=...)] и т.д.
-
убедитесь, что экземпляр UserManager.UserValidator, используемый в вашем AccountController, позволяет использовать специальные символы, используемые в адресах электронной почты. Чтобы сделать это, убедитесь, что его конструктор nondefault выглядит следующим образом:
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
var userValidator = UserManager.UserValidator as UserValidator<ApplicationUser>;
userValidator.AllowOnlyAlphanumericUserNames = false;
}
Надеюсь, это поможет вам взвесить все плюсы и минусы обоих подходов и придумать лучшее решение. Удачи!
Ответ 2
Бит поздно на вечеринку, но я думал, что заброшу свои $0,02.
Хотя верно, что UserName
и Email
являются частью IdentityUser
и, следовательно, требуются, обратите внимание, что оба они отмечены как virtual
. Если вы хотите, чтобы UserName
и Email
были адресом электронной почты, пусть модель ApplicationUser инкапсулирует логику следующим образом:
public class ApplicationUser : IdentityUser
{
private string _userNameEmailBackingField;
public override string UserName
{
get { return _userNameEmailBackingField; }
set { _userNameEmailBackingField = value; }
}
public override string Email
{
get { return _userNameEmailBackingField; }
set { _userNameEmailBackingField = value; }
}
//The rest of your ApplicationUser logic
}
Затем в вашей модели просмотра выставляем только одно свойство и сопоставляем его либо/или в вашем экземпляре ApplicationUser
, гарантируя, что вы украшаете свойство модели представления атрибутами [Required]
и [EmailAddress]
.
Как уже упоминалось, вам нужно убедиться, что для UserManager
UserValidator
AllowOnlyAlphanumericUserNames
установлено значение false
, но я получаю это из коробки с помощью новейшего веб-шаблона в VS2013.
Ответ 3
В настоящее время я работаю над этой функцией для шаблонов Identity 1.1, которые будут переключаться на электронную почту и добавлять функции подтверждения аккаунта/забытого пароля, а два варианта, которые мы рассмотрели, - это взломать (использовать имя пользователя как письмо с проверкой) и добавить дополнительное поле электронной почты, которое отделено от имени пользователя, к которому мы склоняемся.
Скорее всего, в UserManager будет добавлено несколько писем по электронной почте, добавленных в 1.1:
FindByEmail
SetEmail
GetEmail
Ответ 4
Измените свойство UserValidator для объекта UserManager:
public class UserManager : UserManager<User>
{
public IUserStore<User> Users { get; private set; }
public UserManager(IUserStore<User> store) : base(store)
{
Users = store;
UserValidator = new UserValidator<User>(this) {AllowOnlyAlphanumericUserNames = false};
}
}
Ответ 5
Как вы, вероятно, узнали (и ожидалось), ASP.NET Identity 2.0.0, выпущенный в марте 2014 года, добавляет эту функциональность в рамки.
Объявление: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx
Полный пример и руководство, включая подтверждение учетной записи: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity
Ответ 6
Я получаю эту работу.
Сначала в accountViewModels добавьте свойство для UserName
Public Class RegisterViewModel
<Required>
<Display(Name:="User Name")>
Public Property UserName As String
<Required>
<EmailAddress>
<Display(Name:="Email")>
Public Property Email As String
После изменения вида реестра, добавляющего свойство имени пользователя
<div class="form-group">
@Html.LabelFor(Function(m) m.UserName, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.UserName, New With {.class = "form-control"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Email, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"})
</div>
</div>
Как только это будет сделано, измените также свой вид входа
@Html.ValidationSummary(True, "", New With {.class = "text-danger"})
<div class="form-group">
@Html.Label("User Name", New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Email, "", New With {.class = "text-danger"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Password, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.PasswordFor(Function(m) m.Password, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Password, "", New With {.class = "text-danger"})
</div>
</div>
Это все, что вам нужно. Таким образом вы можете LogIn с UserName не с адресом электронной почты.
Я надеюсь, что это может помочь кому-то
Ответ 7
Во время работы над подобной проблемой я нашел, что самое простое решение - просто пометить ввод Username как "Email", а затем вручную установить сообщение о членстве во время onCreating.
protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
RegisterUser.Email = RegisterUser.UserName;
}