身份2.0登录尝试无效

本文关键字:无效 登录 身份 | 更新日期: 2023-09-27 18:02:51

由于某种原因,我还没有发现,但在成功注册和激活后,我无法登录电子邮件地址,而是得到一个错误"无效登录尝试"。

ASP。. NET Identity 2.0已经改进了使用电子邮件登录,我已经修改了注册表单,以实际存储一个真正的用户名,因为现有的注册似乎只是通过存储用户名和电子邮件地址来复制。

请参阅Install-Package Microsoft.AspNet.Identity.Samples -Pre'在创建空ASP后附带的标准代码。. NET Web Application (MVC)项目:

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现在从表单接收一个值。这一切都很好,除了现在我不能登录后注册和激活。唯一的工作是通过将Email字段的值放入UserName字段来修改记录,这看起来很愚蠢。

谁能告诉我我可能错过了什么?

身份2.0登录尝试无效

您必须修改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

类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
}

原因是UserNameUserEmail有不同的值,但PasswordSignInAsync方法只使用UserName来检查登录

我也有同样的问题,但我发现解决方案是将Marcin的公认答案和Hai的答案结合起来。在AccountController.cs中,您需要使用FindByEmailAsync()而不是FindByNameAsync(),然后使用SignInManager.PasswordSignInAsync(),但使用user.UserName的值作为第一个参数(只要user不为空),而不是model.Email。因此,根据当前的锅炉板代码,完整的答案应该是这样的:

    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        // (...) ModelState.IsValid, etc
        string user_name = ""; // in case 'user' is null (user not found)
        var user = await UserManager.FindByEmailAsync(model.Email);
        if (user != null)
        {
            user_name = user.UserName;
            if (!await UserManager.IsEmailConfirmedAsync(user.Id))
            {
                // (...) Require the user to have a confirmed email before they can log on, etc
            }
        }
        // don't use model.Email below, use the value from user.UserName (if user not null)
        var result = await SignInManager.PasswordSignInAsync(user_name, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            // (...)

您可以尝试在项目中更改Startup.cs文件中的bool值。"真正→false"在这一行中,services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)

尝试编辑RequireConfirmedAccount"选项来自"true"在程序课上,它对我起作用了。

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
    .AddEntityFrameworkStores<ApplicationDbContext>();

如果您使用默认的身份验证代码生成,在启动文件中您可能会看到以下代码:

services.AddDefaultIdentity<addition>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

代码强制你使用电子邮件确认,如果你没有这样做,你会得到"Invalid login attempt"误差