Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要发送电子邮件的ASP.Net用户名_Asp.net_Asp.net Mvc 5_Asp.net Identity - Fatal编程技术网

要发送电子邮件的ASP.Net用户名

要发送电子邮件的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的额外属性,但这与其说是解决方案,不如说是一种

我正在使用新的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;            
}
在这里