首页 文章

ASP.Net用户名到电子邮件

提问于
浏览
24

我正在使用新的ASP.NET身份(RTM),我想知道如何将注册和登录从用户名更改为电子邮件 .

我的想法是,我希望我的用户使用他们的电子邮件和密码注册(也可以使用外部登录获取电子邮件),并在顶部设置显示名称/用户名 .

我查看了IdentityUser,我可以看到UserName存在,但是因为它包含在ASP.Net Identity中,无法更改 .

我知道我可以使用'UserName'作为电子邮件,使用自定义验证器,然后为ApplicationUser添加一个名为DisplayName的额外属性,但这更像是一个hack而不是解决方案 .

我希望我的问题很明确 . 提前致谢 .

7 回答

  • 3

    如果你真的想用电子邮件地址登录,那么,恕我直言,你建议的“黑客”是最好的办法 . 因为,如果你坚持“正确地做”,至少你必须这样做

    • 显然修改了数据库模式

    • 自己确保用户名唯一性(你可以让数据库约束/索引为你做这个,但是你必须找到一个很好的方法来处理错误并将它们报告给用户)

    • 找到一个很好的替代品,只需在代码中编写"User.Identity.UserName"即可

    • 可能更多

    另一方面,如果您决定“破解”您需要的UserName字段

    • 修改RegisterViewModel验证(将[EmailAddress]添加到UserName属性),可能会稍微自定义[Display(Name = ...)]等 .

    • 确保AccountController中使用的UserManager.UserValidator实例允许在电子邮件地址中使用特殊字符 . 为此,请确保其非默认构造函数如下所示:

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
        var userValidator = UserManager.UserValidator as UserValidator<ApplicationUser>;
        userValidator.AllowOnlyAlphanumericUserNames = false;
    }
    

    我希望这可以帮助您权衡两种方法的优缺点,并提出最佳解决方案 . 祝好运!

  • 6

    派对迟到了,但我以为我会扔掉0.02美元 .

    虽然 UserNameEmail 都是 IdentityUser 的一部分并且因此是必需的,但请注意它们都标记为 virtual . 如果您希望 UserNameEmail 成为电子邮件地址,请让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] 属性修饰视图模型属性 .

    正如其他人提到的那样,你需要确保 AllowOnlyAlphanumericUserNames 设置为 falseUserManagerUserValidator ,但是你可以使用VS2013中最新的网页模板开箱即用 .

  • 1

    我目前正在为Identity 1.1模板开发此功能,该模板将切换到电子邮件并添加帐户确认/忘记密码功能,我们考虑的两个选项是hack(使用用户名作为验证的电子邮件)并添加其他电子邮件字段这与我们倾向于的用户名是分开的 .

    可能会在1.1中向UserManager添加一些特定于电子邮件的api:

    FindByEmail
    SetEmail
    GetEmail
    
  • 23

    更改UserManager对象的UserValidator属性:

    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};
        }
    }
    
  • 0

    正如您可能已经发现的那样(并且可以预期),2014年3月发布的ASP.NET Identity 2.0.0在框架中添加了此功能 .

    公告: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

  • 9

    在处理类似问题时,我发现最简单的解决方案是将Username输入标记为“Email”,然后在onCreating期间手动设置Membership电子邮件 .

    protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
        RegisterUser.Email = RegisterUser.UserName;            
    }
    
  • 5

    我得到了这个工作 .

    首先转到accountViewModels并为UserName添加一个Property

    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>
    

    这就是你所需要的一切 . 这样,您可以使用UserName而不是使用电子邮件地址登录 .

相关问题