ASP.Net用户名到电子邮件

teh*_*ner 24 asp.net asp.net-mvc-5 asp.net-identity

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

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

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

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

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

roo*_*ess 23

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

  • 显然,修改数据库模式
  • 确保自己的用户名唯一性(你可以让数据库约束/索引为你做这个,但你必须找到一个很好的方法来处理错误并向用户报告)
  • 找到一个很好的替代品,只需在代码中编写"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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 如果您通过ApplicationUser使用自定义主键怎么办?如果我的应用程序用户是ApplicationUser:IdentityUser <int,CustomUserLogin,CustomUserRole,CustomUserClaim>和您的ApplicationUserManager:UserManager <ApplicationUser,int>,则上述UserValidator代码将不起作用.如果我尝试UserValidator <ApplicationUser,int>(manager),它不再想接受我的自定义用户管理器. (2认同)

joe*_*dev 9

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

虽然这是真的,UserName并且Email是两个部分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
}
Run Code Online (Sandbox Code Playgroud)

然后在视图模型中,仅显示单个属性并将其映射到/或在您的ApplicationUser实例中,确保使用[Required][EmailAddress]属性装饰视图模型属性.

正如其他人所提到的那样,你需要确保AllowOnlyAlphanumericUserNames设置falseUserManager's UserValidator,但我在VS2013中使用最新的Web模板开箱即用.


Hao*_*ung 6

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

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

FindByEmail
SetEmail
GetEmail
Run Code Online (Sandbox Code Playgroud)

  • 电子邮件将是IdentityUser上的一个单独字段,由应用程序决定是否对其进行相同处理.它将在下周的某个时间进行. (2认同)

ava*_*lla 5

更改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};
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Arash怎么样?完美地解决了这个问题. (3认同)