要发送电子邮件的ASP.Net用户名
我正在使用新的ASP.NET标识(RTM),我想知道如何将注册和登录从用户名改为电子邮件 我的想法是,我希望我的用户使用他们的电子邮件和密码注册(也可以通过外部登录获取电子邮件),并在顶部设置显示名称/用户名 我已经查看了IdentityUser,我可以看到用户名在那里,但是因为它是打包在ASP.Net标识中的,不能更改 我知道我可以使用“用户名”作为电子邮件,使用自定义验证程序,然后为ApplicationUser添加一个名为DisplayName的额外属性,但这与其说是解决方案,不如说是一种黑客行为要发送电子邮件的ASP.Net用户名,asp.net,asp.net-mvc-5,asp.net-identity,Asp.net,Asp.net Mvc 5,Asp.net Identity,我正在使用新的ASP.NET标识(RTM),我想知道如何将注册和登录从用户名改为电子邮件 我的想法是,我希望我的用户使用他们的电子邮件和密码注册(也可以通过外部登录获取电子邮件),并在顶部设置显示名称/用户名 我已经查看了IdentityUser,我可以看到用户名在那里,但是因为它是打包在ASP.Net标识中的,不能更改 我知道我可以使用“用户名”作为电子邮件,使用自定义验证程序,然后为ApplicationUser添加一个名为DisplayName的额外属性,但这与其说是解决方案,不如说是一种
我希望我的问题是清楚的。提前谢谢 如果你真的想使用电子邮件地址登录,那么,恕我直言,你建议的“黑客”是最好的方法。因为,如果你坚持要“正确地做”,你至少必须这样做
- 显然,要修改数据库模式
- 自己确保用户名的唯一性(您可以让数据库约束/索引为您做到这一点,但您必须找到处理错误并向用户报告错误的好方法)
- 找到一个很好的替代方法来代替在代码中只写“User.Identity.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; }
publiccountcontroller(UserManager UserManager) { UserManager=UserManager; var userValidator=UserManager.userValidator作为userValidator; userValidator.AllowOnlyAlphanumericUserNames=false; }
我希望这可以帮助您权衡两种方法的利弊,并提出最佳解决方案。祝你好运 更改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};
}
}
公共类UserManager:UserManager
{
公共IUserStore用户{get;private set;}
公共用户管理器(IUserStore存储):基本(存储)
{
用户=商店;
UserValidator=newuservalidator(this){AllowOnlyAlphanumericUserNames=false};
}
}
我目前正在为Identity 1.1模板开发此功能,该模板将切换到电子邮件并添加帐户确认/忘记密码功能,我们考虑的两个选项是黑客攻击(使用用户名作为电子邮件进行验证)并添加一个额外的电子邮件字段,该字段与我们倾向于使用的用户名分开
在UserManager的1.1中可能会添加一些特定于电子邮件的API:
FindByEmail
SetEmail
GetEmail
正如您可能已经发现的(并且是意料之中的),2014年3月发布的ASP.NET Identity 2.0.0在框架中添加了此功能 公告:
完整的示例和教程,包括帐户确认:派对有点晚了,但我想我应该投入0.02美元 虽然
用户名
和电子邮件
确实都是标识用户
的一部分,因此都是必需的,但请注意它们都标记为虚拟
。如果希望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
}
然后在视图模型中,仅公开单个属性并将其映射到应用程序用户
实例中的一个/或,确保使用[必需]
和[电子邮件地址]
属性装饰视图模型属性
正如其他人所提到的,您需要确保UserManager
的UserValidator
的AllowOnlyAlphanumericUserNames
设置为false
,但我想您可以在VS2013中使用最新的web模板来实现这一点。
首先转到accountViewModels并为用户名添加属性
Public Class RegisterViewModel
<Required>
<Display(Name:="User Name")>
Public Property UserName As String
<Required>
<EmailAddress>
<Display(Name:="Email")>
Public Property Email As String
公共类RegisterViewModel
公共属性用户名作为字符串
公共属性电子邮件作为字符串
修改注册视图后,添加username属性
<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>
@LabelFor(函数(m)m.UserName,新增为{.class=“col-md-2控制标签”})
@Html.TextBoxFor(函数(m)m.UserName,新增为{.class=“form control”})
@LabelFor(函数(m)m.Email,新的带有{.class=“col-md-2控制标签”})
@Html.TextBoxFor(函数(m)m.Email,新增为{.class=“form control”})
完成此操作后,也可以修改您的登录视图
@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>
@Html.ValidationSummary(True,“,新加{.class=“text danger”})
@Label(“用户名”,新增为{.class=“col-md-2控制标签”})
@Html.TextBoxFor(函数(m)m.Email,新增为{.class=“form control”})
@Html.ValidationMessageFor(函数(m)m.Email,“,新增为{.class=“text danger”})
@LabelFor(函数(m)m.Password,新的带有{.class=“col-md-2控制标签”})
@Html.PasswordFor(函数(m)m.Password,使用{.class=“form control”}新建)
@Html.ValidationMessageFor(函数(m)m.Password,“,新增为{.class=“text danger”})
这就是你所需要的。通过这种方式,您可以使用用户名而不是电子邮件地址登录。在处理类似问题时,我发现最简单的解决方案是将用户名输入标记为“电子邮件”,然后在onCreating期间手动设置成员资格电子邮件
protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
RegisterUser.Email = RegisterUser.UserName;
}
在这里