asp.net-mvc - UserManager.FindAsync 总是返回 null

标签 asp.net-mvc asp.net-identity

我在 a 上有以下登录操作,并且 UserManager.FindAsync 始终返回 null。我正在尝试使用底部显示的代码为用户播种。

有人可以帮忙吗?

    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.Email, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我在 Migrations 下的 Configuration.cs 中有以下代码。它的作用是为我尝试使用上面的代码登录的用户播种。

    protected override void Seed(Temps.Models.ApplicationDbContext context)
    {
        if (!context.Roles.Any(r => r.Name == "Consultant"))
        {
            var store = new RoleStore<IdentityRole>(context);
            var manager = new RoleManager<IdentityRole>(store);
            var role = new IdentityRole { Name = "Consultant" };

            manager.Create(role);
        }

        if (!context.Users.Any(u => u.UserName == "Consultant"))
        {
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            var user = new ApplicationUser
            {
                UserName = "Consultant",
                Email = "consultant@temps-ltd.co.uk"
            };

            manager.Create(user, "password");
            manager.AddToRole(user.Id, "Consultant");
        }

更新

实现 Anthony 的更改后,我收到以下种子代码的以下错误,有什么想法吗?

PM> Update-database
  Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
  No pending explicit migrations.
  Running Seed method.
  System.InvalidOperationException: UserId not found.
     at Microsoft.AspNet.Identity.UserManager2.<AddToRoleAsync>d__83.MoveNext()
  --- End of stack trace from previous location where exception was thrown ---
     at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
     at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
     at Microsoft.AspNet.Identity.AsyncHelper.RunSync[TResult](Func1 func)
     at Microsoft.AspNet.Identity.UserManagerExtensions.AddToRole[TUser,TKey](UserManager2 manager, TKey userId, String role)
     at Temps.Migrations.Configuration.Seed(ApplicationDbContext context) in c:\Work\@wandc\Temps\trunk\src\Temps\Migrations\Configuration.cs:line 67
     at System.Data.Entity.Migrations.DbMigrationsConfiguration1.OnSeed(DbContext context)
     at System.Data.Entity.Migrations.DbMigrator.SeedDatabase()
     at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase()
     at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId)
     at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId)
     at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
     at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
     at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
     at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
     at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
     at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
     at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
     at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
     at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
     at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
     at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
     at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
     at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
  UserId not found.

代码:

        if (!context.Users.Any(u => u.UserName == "admin@temps-ltd.co.uk"))
        {
            string emailAddress = "admin@temps-ltd.co.uk";

            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            var user = new ApplicationUser()
            {
                UserName = emailAddress,
                Email = emailAddress,
                FirstName = "Admin",
                LastName = "Admin",
                PasswordHint = password
            };

            manager.Create(user, password);                
            manager.AddToRole(user.Id, "Admin");
        }

最佳答案

FindAsync() 将用户名作为第一个参数。因此,您实际上需要更改登录表单/ View 模型以使用用户名而不是电子邮件。

标准的 ASP.NET 模板将用户名设置为电子邮件,这就是 FindAsync() 使用开箱即用的电子邮件地址的原因。所以另一种选择是做同样的事情,并在为数据库做种时使用电子邮件作为用户名。

关于asp.net-mvc - UserManager.FindAsync 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26145102/

相关文章:

c# - MVC 3 中的输出缓存和替换

asp.net-mvc - 该模型在MVC中的作用是什么?

asp.net - 重新使用现有 Microsoft Identity 用户表时密码(哈希)不匹配

sql-server - 无法在 AspNetUsers 表中插入用户

c# - 如何仅使用 AspNet.Identity 在站点之间发送和接收身份验证票

javascript - Grunt - pkg 未定义

asp.net-mvc - 尝试使用 fiddler 获取 oauth token

mysql - 具有自定义身份存储的 ASP.NET Web 应用程序和 MySQL

c# - Amazon 和 Evernote 的身份验证设置

asp.net-mvc - 如何在数据层或类中使用RavenDB查询?