ASP.NET标识:仅允许字母数字用户名实现

时间:2014-04-18 11:10:58

标签: asp.net asp.net-mvc vb.net entity-framework asp.net-identity

我使用的是Asp.net Identity 1.0,并希望使用'username'的电子邮件地址。

经过研究,我发现这篇文章似乎提出了一个解决方案:AllowOnlyAlphanumericUserNames - how to set it? (RC to RTM breaking change) ASP.NET Identity

因此我实现了代码(我正在使用vb.net):

Public Class AccountController
Inherits Controller

Public Sub New()
    Me.New(New UserManager(Of ApplicationUser)(New UserStore(Of ApplicationUser)(New ApplicationDbContext())))
End Sub

Public Sub New(manager As UserManager(Of ApplicationUser))
    UserManager = manager
    UserManager.UserValidator = New UserValidator(Of ApplicationUser)(UserManager) With {.AllowOnlyAlphanumericUserNames = False}
End Sub

Public Property UserManager As UserManager(Of ApplicationUser)

但是当我的代码调用usermanager时:

 Dim result = Await UserManager.CreateAsync(user, acct.password)

我在调试器之外得到一个异常:

  

一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:   System.Data.Entity.Validation.DbEntityValidationException:验证   一个或多个实体失败。请参阅'EntityValidationErrors'属性   了解更多详情。

     

来源错误:

     

Dim result = Await UserManager.CreateAsync(user,acct.password)第294行:
  如果result.Succeeded那么Trace.WriteLine(“成功创建:”+ acct.username)

     

堆栈追踪:

     

[DbEntityValidationException:一个或多个验证失败   实体。有关详细信息,请参阅“EntityValidationErrors”属性。]
  System.Data.Entity.Internal.InternalContext.SaveChangesAsync(的CancellationToken   cancelToken)+219
  System.Data.Entity.Internal.LazyInternalContext.SaveChangesAsync(的CancellationToken   cancelToken)+66
  System.Data.Entity.DbContext.SaveChangesAsync(的CancellationToken   cancelToken)+60
  System.Data.Entity.DbContext.SaveChangesAsync()+63
  Microsoft.AspNet.Identity.EntityFramework.d__0.MoveNext()   等

看到异常未被调试器捕获,我无法看到'EntityValidationErrors'是什么。但是,在我插入uservalidator之前,我能够捕获标准的“非字母数字不允许”异常。

有人对我做错了什么吗?谢谢。

1 个答案:

答案 0 :(得分:1)

当实体框架将实体保存到数据库时,您的错误发生了。您应该阅读Validation failed for one or more entities. See 'EntityValidationErrors' property for more details

顺便说一句,您想使用电子邮件地址作为用户名,因此请使用正确的UserValidator

Public Class EmailUserValidator(Of TUser As IUser)
    Implements IIdentityValidator(Of TUser)

    Public Function ValidateAsync(user As TUser) As Task(Of IdentityResult) Implements IIdentityValidator(Of TUser).ValidateAsync
        Try
            Dim address = New MailAddress(user.UserName)
            Return Task.FromResult(New IdentityResult())
        Catch
            Return Task.FromResult(New IdentityResult("Invalid Email."))
        End Try
    End Function
End Class