我对MVC5的标准ASP身份提供程序有疑问。我一登录方法:
await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
不断返回失败。所以我开始调试,使用:
UserManager.FindByEmail(model.Email);
这会为我尝试登录的用户返回有效的UserID。 然后我用了:
SignInManager.UserManager.CheckPassword(UserIDObtainedFromFind, model.Password);
这会返回true,这意味着我提供的密码有效....
关于如何跟踪,调试 SignInManager.PasswordSignInAsync 方法以查看失败位置的任何想法?
答案 0 :(得分:72)
SignInManager.PasswordSignIn使用用户名,您应该仔细检查用户名是否与您传入的电子邮件相同。
答案 1 :(得分:25)
如果username != email
:
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
答案 2 :(得分:4)
就我而言,验证电子邮件和密码的同一探针,电子邮件与我的用户相同。
var userDO = _userManager.FindByEmailAsync(Input.Email).Result;
var validatr = _userManager.CheckPasswordAsync(userDO, Input.Password);
电子邮件=用户名
真实结果
然后我检查了数据库,发现没有工作的用户的验证字段为假
然后必须在启动时验证验证参数。在 Startup.cs
内public void ConfigureServices(ServiceCollection services)
{
//......
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
//......
}
上述属性设置获取或设置一个标志,该标志指示是否需要已确认的IUserConfirmation帐户登录
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
再见!
答案 3 :(得分:2)
对我来说,我发现使用SQL事件探查器查看PasswordSignInAsync正在调用的查询很有帮助。在我的情况下 - 我注意到它试图找到一个将Discriminator设置为“UserContext”的用户。这当然不适合我,因为我从ASP.NET Membership Services升级,并且此Discriminator设置为User。由于新代码使用实体框架,因此该值似乎是从您为用户使用的类派生的。快速更新声明解决了这个问题。
UPDATE AspNetUsers SET Discriminator = 'UserContext' WHERE Discriminator = 'User'
答案 4 :(得分:1)
这对我有用
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
答案 5 :(得分:1)
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName,
model.Password, model.RememberMe, shouldLockout: false);
这对我有用,因为我的用户名不等于我的电子邮件。您的电子邮件和用户名应该相同。
答案 6 :(得分:0)
现在有点老了,但这是我在这个问题上的昙花一现。
我在实用程序中进行了一些静态数据创建,以确保Identity数据库中存在一些标准内容(角色和管理员帐户)。
我正在创建实体并直接与上下文对话以创建任何缺少的角色或该用户。我遇到的问题是我没有设置NormalizedUserName
和NormalizedEmail
字段。我只是设置Email
和UserName
。
我使用的最终代码(使用EF Core 2.x)类似于:
if (!_context.Users.Any(_ => _.Id.Equals(Users.AdministratorId)))
{
var user = new ApplicationUser
{
Id = Users.AdministratorId,
UserName = Users.AdministratorEmail,
Email = Users.AdministratorEmail,
EmailConfirmed = true,
NormalizedEmail = Users.AdministratorEmail.ToUpper(),
NormalizedUserName = Users.AdministratorEmail.ToUpper(),
SecurityStamp = Guid.NewGuid().ToString()
};
var hasher = new PasswordHasher<ApplicationUser>();
user.PasswordHash = hasher.HashPassword(user, "our_password");
_context.Users.Add(user);
}
答案 7 :(得分:0)
在你的启动检查中:
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
如果这些设置为true,您需要先确认电子邮件或电话号码才能登录。
答案 8 :(得分:0)
如果以上都不是导致问题的原因(就我而言,问题是我自己的IUserStore实现中的复制粘贴错误),然后回答您的问题“ 有关如何跟踪的任何想法,或调试SignInManager.PasswordSignInAsync方法以查看失败的地方?“,一种调试方法是将SignInManager.PasswordSignInAsync方法的内容复制到您自己的派生类(ApplicationSignInManager)中。
答案 9 :(得分:0)