我使用的是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之前,我能够捕获标准的“非字母数字不允许”异常。
有人对我做错了什么吗?谢谢。
答案 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