ASP.NET CORE中SignInManager无法登录Seeder创建的管理员用户
登录报错「Invalid login attempt」的原因及解决方法
你可以按以下优先级排查问题:
1. 配置键拼写错误
你在BaseSeeder中读取管理员邮箱的配置键存在拼写错误,少了末尾的s:
// 错误写法,正确拼写应为 AdminEmailAddress protected string AdminEmail => this.config.GetSection("AdminEmailAddres").Value;
如果你的appsettings.json中对应的配置键是正确拼写的AdminEmailAddress,那么代码读取到的AdminEmail会是null,创建的用户邮箱字段为空,自然无法通过邮箱匹配到用户。
2. 日志逻辑误导,用户实际未创建成功
你在AdminUserSeeder中无论用户创建是否成功,都会输出「Seeding admin user has been successful」的日志:
var result = await this.UserManager.CreateAsync(adminUser, this.AdminPassword); if (result.Succeeded) await this.UserManager.AddToRoleAsync(adminUser, this.Roles.AdminRole); // 无论创建结果如何都输出成功日志,容易产生误导 this.Logger.LogInformation(@$"Seeding admin user has been successful");
如果你的管理员密码不符合Identity默认的密码策略(默认要求:长度≥6位、包含至少1个大写字母、1个小写字母、1个数字、1个非字母数字特殊字符),CreateAsync会执行失败,你却会误以为用户已经创建成功。
建议补充创建失败的日志输出:
if (!result.Succeeded) { var errorMsg = string.Join(Environment.NewLine, result.Errors.Select(v => v.Description)); this.Logger.LogError($"创建管理员用户失败:{errorMsg}"); return; }
3. 登录逻辑参数不匹配
Identity默认的SignInManager.PasswordSignInAsync方法第一个参数接收的是用户名(UserName),而非邮箱。你创建的管理员用户UserName是固定写死的admin,如果你登录时输入的是邮箱作为账号,直接传给PasswordSignInAsync方法会匹配不到用户。
如果需要支持邮箱登录,需要修改登录逻辑:先通过邮箱查询到对应用户,再调用CheckPasswordSignInAsync方法校验密码:
var user = await _userManager.FindByEmailAsync(Input.Email); if (user == null) { ModelState.AddModelError(string.Empty, "无效的登录尝试"); return Page(); } var result = await _signInManager.CheckPasswordSignInAsync(user, Input.Password, Input.RememberMe);
4. 密码配置存在偏差
检查你appsettings.json中AdminPassword对应的值,是否存在前后空格、大小写错误、特殊字符未转义的问题,导致实际创建用户时用的密码和你登录时输入的密码不一致。
内容的提问来源于stack exchange,提问作者Boyan Mihnev
相关产品推荐
相关产品推荐

