【问题标题】:How to create ApplicationUser by UserManager in Seed method of ASP .NET MVC 5 Web application如何在 ASP .NET MVC 5 Web 应用程序的 Seed 方法中通过 UserManager 创建 ApplicationUser
【发布时间】:2014-10-14 03:00:42
【问题描述】:

我可以用旧的方式创建用户:

 var users = new List<ApplicationUser> { 
                        new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl",  SecurityStamp = Guid.NewGuid().ToString()},
                        new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4445@wp.pl", UserName = "informatyka4445@wp.pl",  SecurityStamp = Guid.NewGuid().ToString()}
                        };

users.ForEach(user => context.Users.AddOrUpdate(user));

context.SaveChanges();

但我想以 ASP.NET MVC 5.1 的方式使用 UserManager。我偷看了Register POST 方法在AccountController 中的样子:

 public async Task<ActionResult> Register(RegisterViewModel model) {
            if (ModelState.IsValid) {
                var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
                IdentityResult result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded) { [...]

所以我尝试做同样的事情:

var user =  new ApplicationUser() { Email = "informatyka4444@wp.pl", 
                                    UserName = "informatyka4444@wp.pl"};
IdentityResult result =  UserManager.CreateAsync(user, "abcwq12312!P");

但我明白了:

如果我只输入UserManager. VS2013 也不会在列表中显示任何方法。

那么如何通过这种方式添加用户呢?

编辑1:

【问题讨论】:

  • 您是否有任何特殊原因要使用 UserManager 类?通常我会建议在 Seed 方法中使用上下文(而不是 Identity 的东西 - 在数据库播种期间它的异步方法没有任何好处)和 Identity 框架的其余部分应用程序(不使用任何上下文)。
  • @Horizo​​n_Net 我想学习怎么做。

标签: c# .net asp.net-identity seed asp.net-mvc-5.1


【解决方案1】:

好的,所以创建用户CreateAsync 是不必要的,问题出在其他地方。应该使用ApplicationUserManager 而不是UserManager(这个没有向数据库添加任何内容)。

 var store = new UserStore<ApplicationUser>(context);
 var manager =  new ApplicationUserManager(store);
 var user = new ApplicationUser() { Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl" };
 manager.Create(user, "TestPass44!");

【讨论】:

  • 嗨@Yoda,请解释上面代码中使用的上下文值 "var store = new UserStore(context)" 。谢谢
  • 我在种子方法中使用了 UserManager 没有问题。只要确保检查结果。Succeeded = true。如果没有任何内容保存到数据库中,您可能会遇到弱密码错误。
  • 你是救生员!
【解决方案2】:

我不明白您显示的错误,除非您提供自定义 TUserTKey 在这种情况下会像:

IdentityResult user = await UserManager.CreateAsync<CustomUser, CustomKey>(user, "abcwq12312!P");

并将用户作为您的CustomUser 而不是ApplicationUser 传递,如果您的CustomKey 是一个int 而不是字符串,则可能是int。 (CreateAsync 可以推断类型,我在那里发布以明确显示它们)

我看到的另一个问题是您没有在等待任务,您还必须添加等待,例如:

IdentityResult user = await UserManager.CreateAsync(user, "abcwq12312!P");

希望这会有所帮助。


编辑:

为了完整起见,我将发布此问题的完整答案,但有你的答案。 :Unable to access CreateAsync in User Manager

var result = await UserManager.CreateAsync(user, register.Password);

上述语句中的UserManager 不是我之前所说的Class 预期的。它是UserManager&lt;ApplicationUser&gt; 类型的属性。

所以,一开始只是将一个属性声明为

public UserManager<ApplicationUser> UserManager { get; private set; }

现在我可以使用Async 版本来创建用户。这 以下语句有效。

var result = await UserManager.CreateAsync(user, register.Password);

我也会标记可能的重复。

【讨论】:

  • 试过之前请查看 OP 中的编辑。我还在方法描述中添加了异步。
  • 经过更好的研究,我想这是你的答案:stackoverflow.com/questions/24081586/…
  • 我发布了答案。感谢您的帮助。
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 2014-03-14
  • 2023-04-04
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多