You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:54:00