【问题标题】:Create user without UserManager in Asp.Net Core Identity在 Asp.Net Core Identity 中创建没有 UserManager 的用户
【发布时间】:2017-08-09 07:02:03
【问题描述】:

在一个带有 ASP.NET Identity 的 ASP.NET Core 1.1 应用程序上,我创建了一个用户:

PasswordHasher<User> hasher = new PasswordHasher<User>();

User user = new User {
  Email = "john@company.com",
  Username = "john@company.com
};

user.PasswordHash = hasher.HashPassword(user, "johnpass");

context.Users.Add(user);
context.SaveChanges();

用户已创建,但当我尝试使用以下内容签名时失败:

SignInResult result = await _signInManager.PasswordSignInAsync("john@company.com", "johnpass", false, true);     

然后我尝试使用 UserManager 创建用户:

PasswordHasher<User> hasher = new PasswordHasher<User>();

User user = new User {
  Email = "john@company.com",
  Username = "john@company.com
};

await userManager.CreateAsync(user, "johnpass");

现在我可以登录了。看来问题出在 HashPassword 方法上。

有谁知道如何在没有 UserManager 的情况下创建用户?

更新
我试图创建一个 UserManager 而不使用 Injection,因为我是在控制台应用程序而不是 Web 应用程序上创建测试数据:

var userStore = new UserStore(Context);

var userManager = new UserManager<User>(userStore, null, null, null, null, null, null, null, null); 

用户已创建,但我仍然无法登录。

【问题讨论】:

  • 不仅仅是密码哈希,还有安全标记。
  • 安全印章?你能举个例子怎么解决吗?
  • 你已经知道答案了:使用UserManager
  • 这就是重点......我试图不使用它,因为我使用控制台应用程序在 Web 应用程序上下文之外注入测试数据。似乎 UserManager 期望在其中注入一堆类,而在我的控制台应用程序上我没有。
  • 用户管理器类并不需要那么多注入。它需要一个UserStore,它本身需要一个DbContext。应该不难弄清楚。

标签: c# asp.net-core asp.net-identity asp.net-identity-3


【解决方案1】:

你必须做以下事情:

userManager.UpdateSecurityStampAsync(domainUser);
        domainUser.NormalizedUserName = domainUser.NormalizedEmail = domainUser.UserName = domainUser.Email;
        await userManager.UpdateNormalizedUserNameAsync(domainUser);
        await userManager.UpdateNormalizedEmailAsync(domainUser);
        await userManager.UpdateAsync(domainUser);

如果您在配置中设置了电子邮件确认

var token = await userManager.GenerateEmailConfirmationTokenAsync(domainUser);
await userManager.ConfirmEmailAsync(domainUser, token);

【讨论】:

    【解决方案2】:

    按照以下场景登录。

    1. 使用用户名或电子邮件获取用户。
      user = context.Users.FirstOrDefault(usr =&gt; usr.UserName == userName);

    2. 检查此用户是否有此密码或未使用: userManager.CheckPasswordAsync(user, password);

    其中 userManager 是来自UserManager&lt;User&gt; 的对象

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 2019-03-16
      • 2019-08-21
      • 2020-10-29
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      相关资源
      最近更新 更多