在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户

Posted

技术标签:

【中文标题】在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户【英文标题】:Creating Asp.net Identity user in Seed method of Db Initializer 【发布时间】:2014-12-16 06:39:58 【问题描述】:

我首先使用 EF 6 代码创建了我的数据层,并通过继承自 DropCreateDatabaseIfModelChangesEvInitializer 类的 Seed 方法填充数据库。 Seed方法的实现是

protected override void Seed(EvContext context)

   //Add other entities using context methods
   ApplicationUserManager manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context));
   var user = new ApplicationUser  Email = "admin@myemail.com" ,UserName = "admin@myemail.com";
   var result = await manager.CreateAsync(user, "Temp_123");//this line gives error. obviously await cannot be used in non- async method and I cannot make Seed async

我的问题是如何使用UserManager 类在Seed 方法中添加用户。当我改变 var result = awit manager.CreateAsync(user, "Temp_123");var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait 应用程序无限期挂起

【问题讨论】:

【参考方案1】:

在 asp.net-identity-2 中,用户管理器有非异步方法来创建。

var user = new ApplicationUser  Email = "admin@myemail.com", UserName = "admin@myemail.com" ;
manager.Create(user, "Temp_123");

如果你想创建“管理员”角色,rolemanager 也是如此。

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
roleManager.Create(new Role("admin"));

使用户成为管理员

manager.AddToRole(user.Id, "admin");

编辑:正如 trailmax 评论的那样,Create() 扩展方法带有 Microsoft.AspNet.Identity 命名空间,所以不要忘记 using Microsoft.AspNet.Identity

【讨论】:

没有manager.Create 方法。我检查了我安装的 nuget 包,我有 Microsoft.AspNet.Identity.Core 的 2.1.0 版本。有什么想法吗? 我的项目中也有 2.1.0 版本,我可以导航到这两种扩展方法。也许尝试重新安装软件包 使用Update-Package -reinstall Microsoft.AspNet.Identity.Core 重新安装了软件包,但ApplicationUserManager 中仍然没有创建用户的同步方法。我正在将 Identity 与 Web api 一起使用,如果这很重要? 类的同步版本是来自Microsoft.AspNet.Identity.UserManagerExtensions类的扩展方法。检查您的命名空间导入。 这行得通。奇怪的是,创建将不允许用户名中的空格,并且失败且没有错误。更奇怪的是,在 AccountsController 的 Register 方法中使用的 CreateAsync 确实允许空格。【参考方案2】:

TMG 是正确的 - 有可用的非异步方法,这是在这种特殊情况下最简单的方法。

但是,一般来说 - 当您只有一个异步版本的函数可供您使用,并且您不能将方法的实现更改为异步时 - 您可以创建一个任务并同步等待它。

所以 - 而不是:

IdentityResult result = await manager.CreateAsync(user, "Temp_123");

你可以编码:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.Wait();

一旦等待完成,IdentityResult 会在

中返回
createTask.Result

您还可以在等待上设置超时,如下所示:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
if (!createTask.Wait(5000)) // Wait up to 5 seconds

   // We've timed out waiting - Do some error handling

else if (!createTask.Result.Succeeded)

  // Creating the user failed - Do some error handling

【讨论】:

以上是关于在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户的主要内容,如果未能解决你的问题,请参考以下文章

运行 rake db:seed 未从 seed.rb 加载

在服务器上运行db:seed数据填充时,出错的问题解决

Entity Framework Code-First(18):Turn off DB Initializer

您如何在 AWS Elastic Beanstalk 应用程序上调用 db:seed?

在 AWS Elastic Beanstalk 上运行 rake db:seed

我可以将参数传递给 rake db:seed 吗?