ASP.NET身份提供程序SignInManager保持返回失败

Jac*_*rst 26 c# asp.net asp.net-identity

我对MVC5的标准ASP身份提供程序有疑问.我一登录方法:

await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
Run Code Online (Sandbox Code Playgroud)

不断回来失败.所以我开始调试,使用:

UserManager.FindByEmail(model.Email);
Run Code Online (Sandbox Code Playgroud)

这将为我的用户尝试登录返回有效的UserID.然后我使用:

SignInManager.UserManager.CheckPassword(UserIDObtainedFromFind, model.Password);
Run Code Online (Sandbox Code Playgroud)

这返回true,这意味着我提供的密码是有效的....

签到失败

关于我如何跟踪,调试SignInManager.PasswordSignInAsync方法以查看它失败的地方的任何想法?

Hao*_*ung 78

SignInManager.PasswordSignIn使用用户名,您应该仔细检查用户名是否与您传入的电子邮件相同.

  • 你也应该恢复NormalizedUserName,如果你这样做的话 (2认同)
  • 正如@AliGonabadi 所提到的,只是添加手动更改用户名字段仍会导致失败,并且还必须更改 NormalizedUserName 才能使此修复程序起作用。 (2认同)

小智 26

如果username != email:

ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
Run Code Online (Sandbox Code Playgroud)


小智 11

在我的例子中,相同的探针验证电子邮件和密码,电子邮件与我的用户相同。

    var userDO = _userManager.FindByEmailAsync(Input.Email).Result;
    var validatr = _userManager.CheckPasswordAsync(userDO, Input.Password);
Run Code Online (Sandbox Code Playgroud)

电子邮件=用户名

真实结果

然后查数据库发现没起作用的用户验证字段是false

在此输入图像描述

那么验证参数必须在启动时进行验证。位于Startup.cs内

public void ConfigureServices(ServiceCollection services)
{
//......
            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddRoles<IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>();
//......
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

上述属性设置 获取或设置一个标志,指示是否需要已确认的 IUserConfirmation 帐户才能登录

options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
Run Code Online (Sandbox Code Playgroud)

再见!