出于某种原因,我还没有发现,但在注册和激活成功后,我无法使用电子邮件地址登录,而是收到“无效登录尝试”错误。
由于使用电子邮件登录改进了ASP.NET Identity 2.0,我已经修改了注册表单以实际存储真实用户名,因为现有注册似乎通过将用户名与电子邮件地址一起存储来复制。
在创建空的ASP.NET Web应用程序(MVC)项目之后,请参阅下面Install-Package Microsoft.AspNet.Identity.Samples -Pre'
附带的标准代码:
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
我的功能现在如下:
var user = new ApplicationUser { TitleId = model.TitleId, SexId = model.SexId, Forename = model.Forename, Surname = model.Surname, UserName = model.UserName, Email = model.Email, JoinDate = System.DateTime.Now };
正如您所见,UserName现在从表单接收值。这一切都很好,除了现在我注册和激活后无法登录。唯一的工作是通过将电子邮件字段中的值放入UserName字段来修改记录,这个字段似乎很愚蠢。
有人可以告诉我可能错过了什么吗?
答案 0 :(得分:9)
您必须修改SignInHelper.PasswordSignIn
方法。默认情况下,它使用FindByNameAsync
来检查具有给定名称的用户是否存在:
public async Task<SignInStatus> PasswordSignIn(string userName, string password, bool isPersistent, bool shouldLockout)
{
var user = await UserManager.FindByNameAsync(userName);
// (...)
将其更改为使用FindByEmailAsync
:
var user = await UserManager.FindByEmailAsync(userName);
您可以在* AppCode \ IdentityConfig.cs`文件中找到SignInHelper
类。
答案 1 :(得分:4)
在课程 AccountController.cs 中,方法:public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
。
修改了这个:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
对此:
try
{
var user = db.Users.Where(u => u.Email.Equals(model.Email)).Single(); // where db is ApplicationDbContext instance
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
}
catch (InvalidOperationException)
{
// the user is not exist
}
原因是UserName
和UserEmail
具有不同的值,但方法PasswordSignInAsync
仅使用UserName
来检查登录。
答案 2 :(得分:3)
我有同样的问题,但发现解决方案是Marcin接受的答案和Hai的答案的组合。在AccountController.cs
中,您需要使用FindByEmailAsync()
而不是FindByNameAsync()
,然后使用SignInManager.PasswordSignInAsync()
,但使用user.UserName
的值作为第一个参数(只要{ {1}}不是null),而不是user
。因此,基于当前锅炉板代码的完整答案将是这样的:
model.Email
答案 3 :(得分:0)
您可以尝试在项目的Startup.cs文件中更改为bool值。 “真->假”
在这一行中,services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)