Имя пользователя 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;            
}