configurationMicrosoft.AspNet.Identity以允许将电子邮件地址作为用户名

我正在创build一个新的应用程序,并开始使用EF6-rc1,Microsoft.AspNet.Identity.Core 1.0.0-rc1,Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1,Microsoft.AspNet.Identity .Owin 1.0.0-rc1等,以及昨天发布的RTM,我今天晚上通过NuGet更新到RTM。

除了对迄今为止所做的工作的一些代码更改之外,似乎所有的工作都进行得很顺利,直到我尝试为应用程序创build一个本地用户帐户。

我一直在使用电子邮件地址作为用户名格式,而这个候选版本的工作很好,但是现在当用一个用户名的电子邮件地址创build一个用户时,它会抛出以下validation错误:

User name xxxxx@xxxx.com is invalid, can only contain letters or digits. 

我已经花了最后一个小时左右的时间寻找一个解决scheme或文件的configuration选项,但无济于事。

有没有一种方法可以将其configuration为允许用户名的电子邮件地址?

你可以通过在UserManager上插入你自己的UserValidator来实现,或者在默认实现中closures它:

 UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false } 

这个(在App_Code \ IdentityModels.cs中)的C#版本是

 public UserManager() : base(new UserStore<ApplicationUser>(new ApplicationDbContext())) { UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false }; } 

在我的情况下,使用ASP.NET Identity 2.0在VS 2013 C#中运行MVC 5.2.2,解决scheme是更新App_Start \ IdentityConfig.cs中的ApplicationUserManager构造函数,如下所示:

 public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) { this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false }; } 

如果你正在使用ASP.Net webforms并试图做到这一点,只需打开你的IdentityModels.vb / cs文件,并在公共类UserManager下,看起来像这样:

 Public Class UserManager Inherits UserManager(Of ApplicationUser) Public Sub New() MyBase.New(New UserStore(Of ApplicationUser)(New ApplicationDbContext())) Users = store UserValidator = New UserValidator(Of ApplicationUser)(Me) With {.AllowOnlyAlphanumericUserNames = False} End Sub Public Property Users() As IUserStore(Of ApplicationUser) Get Return m_Users End Get Private Set(value As IUserStore(Of ApplicationUser)) m_Users = value End Set End Property Private m_Users As IUserStore(Of ApplicationUser) End Class 

如果您找不到IdentityConfig.cs,请使用此代码replace您的AccountController构造函数。

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

在我的情况下,我有一个存储库类与身份validation工作,这不让我用“ – ”里面的用户名..修复是在这里的构造函数:

 //------------------------------------------------------- public AuthRepository() //------------------------------------------------------- { _ctx = new AuthContext(); _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx)); _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager) { AllowOnlyAlphanumericUserNames = false }; } 

我也一直坚持这个,因为大部分时间用户名是电子邮件这些天,我可以理解一个单独的电子邮件字段的推理。 这些纯粹是我的想法/经验,因为我也找不到微软对此的说法。

请记住,Asp Identity纯粹是为了识别某个人,因此您不需要识别电子邮件,但可以将其存储起来,因为它是身份的一部分。 当您在Visual Studio中创build新的Web项目时,您可以selectvalidation选项。

如果您select一个非空项目types(如MVC)并将身份validation设置为“个人账户”,那么您将获得用户pipe理的基本基础。 其中之一包括在App_Start \ IdentityConfig.cs中看起来像这样的子类:

  // Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application. public class ApplicationUserManager : UserManager<ApplicationUser> { public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); // Configure validation logic for usernames manager.UserValidator = new UserValidator<ApplicationUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; } //NB rest of code removed } 

这告诉我们的是,微软希望我们存储更复杂的用户名(参考AllowOnlyAlphaNumericUserNames = false),所以我们真的有混合的信号。

这是从一个默认的Web项目产生的事实给了我们一个很好的指示/方向从微软(和一个干净的方式),使我们能够input用户名字段的电子邮件。 它是干净的,因为在使用Microsoft.OWIN上下文引导应用程序时,在App_Start \ Startup.Auth.cs中使用静态创build方法。

这种方法唯一的缺点是你最终将电子邮件存储两次….这是不好的!

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

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