【问题标题】:Asp.Net core identity - UserManager.Users.Any() returns always falseAsp.Net 核心身份 - UserManager.Users.Any() 总是返回 false
【发布时间】:2020-05-17 01:03:43
【问题描述】:

这是我第一次尝试创建 IDP。我选择使用 Asp.Net Core Identity (3.1.4) 和 IdentityServer4 (3.1.3)。刚开始使用IdentityUser时一切正常,但昨天我想为我的用户添加一些属性,所以我决定添加一个类ApplicationUser来保存这些属性,ApplicationUser当然来自@ 987654324@.

所以,我将所有使用IdentityUser 的实例替换为ApplicationUser,并认为这就是它的结束。但是今天当我尝试编译以测试我的工作时,我发现在创建后将用户添加到数据库的播种方法是找不到任何用户,因此总是试图一遍又一遍地添加相同的用户。

我发现这段代码不能正常工作。从现在开始,它总是给我false,尽管已经在数据库中创建了 3 个用户。虽然我必须说用户是在我将ApplicationUser 添加到项目之前创建的。

var userManager = scope.ServiceProvider.GetRequiredService<UserManager<ApplicationUser>>();
if (!userManager.Users.Any())
{
    string password = string.Empty;
    foreach (var testUser in Users.Get())
    {
        var identityUser = new ApplicationUser(testUser.Username)
        {
            Id = testUser.SubjectId,
        };
        password = testUser.Password;
        var passwordValidators = userManager.PasswordValidators;
        List<string> passwordErrors = new List<string>();
        foreach (var validator in passwordValidators)
        {
            IdentityResult result = await validator.ValidateAsync(userManager, null, password);

            if (!result.Succeeded)
            {
                foreach (var error in result.Errors)
                {
                    passwordErrors.Add(error.Description);
                }
            }
        }
        if (string.IsNullOrEmpty(password) || passwordErrors.Count > 0)
        {
            password = "Password123!";
        }

        userManager.CreateAsync(identityUser, password).Wait();
        userManager.AddClaimsAsync(identityUser, testUser.Claims.ToList()).Wait();
    }
}

如果您想查看我的 startup.cs 中的 ConfigureServices 中的 IdentityServer 和网络核心身份,这里是:

string connectionStringISD = Configuration.GetConnectionString("IdentityServerData");
string connectionStringUDB = Configuration.GetConnectionString("UsersDB");

string migrationsAssembly = typeof(Startup)
.GetTypeInfo().Assembly.GetName().Name;

services.AddDbContext<IDPContext>(o => o.UseSqlServer(connectionStringUDB, so => so.MigrationsAssembly(migrationsAssembly)));

services.AddIdentity<ApplicationUser, IdentityRole>()//options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<IDPContext>()
.AddDefaultTokenProviders();

var IS4Builder = services.AddIdentityServer(options =>
{
    options.Events.RaiseErrorEvents = true;
    options.Events.RaiseInformationEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.Events.RaiseSuccessEvents = true;
    options.UserInteraction.LoginUrl = "/Account/Login"; //do i need this?
    options.UserInteraction.LogoutUrl = "/Account/Logout"; //do I need this?
    options.Authentication = new AuthenticationOptions()
    {
        CookieSlidingExpiration = true
    };
})
// this adds the operational data from DB (codes, tokens, consents)
.AddOperationalStore(options => {
    options.ConfigureDbContext = builder =>
    builder.UseSqlServer(connectionStringISD, sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly));
    options.EnableTokenCleanup = true;
})
// this adds the config data from DB (clients, resources)
.AddConfigurationStore(options =>
options.ConfigureDbContext = builder =>
builder.UseSqlServer(connectionStringISD, sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly)))
.AddAspNetIdentity<ApplicationUser>();

if (Environment.IsDevelopment())
{
    IS4Builder.AddDeveloperSigningCredential();
}
else
{
    IS4Builder.AddSigningCredential(LoadCertificateFromStore(Configuration.GetValue<string>("SigningCertificate")));
}

这也是我如何在Configure 方法中调用播种方法

 ConfigurationDbContextExtension.InitializeDbDataAsync(app).Wait();

有什么想法吗?如果可能的话,我想避免销毁和重新创建数据库。

【问题讨论】:

  • 另外,我无法登录或执行任何需要从数据库获取用户的操作,例如 Context.Users.Any() 或 Context.AppUsers.Any()(我确实添加了 AppUsers dbSet根据上下文,但我不知道是否应该删除它)

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


【解决方案1】:

您提到您使用 ApplicationUser 类来添加更多属性。

如果您使用 Code First 迁移,您应该使用 ef add migration 命令。和更新数据库方案。 我只是假设你忘记了迁移:)

换句话说,请确保您的 ApplicationUser 在字段方面与 AspNetUsers 表同步。

【讨论】:

  • 您好,感谢您的回复,但不幸的是我没有忘记迁移。我实际上确实添加了它们。虽然我还没有向 ApplicationUser 添加任何属性。我只是想看看这是否有帮助。但它没有=(
  • 我不得不删除数据库并重新创建它才能工作。尽管我进行了迁移,但数据库是最新的,而且所有这些都是爵士乐。我希望我不必破坏我的生产数据库......但这可能与我更新以搭建身份视图的 nuget 包有关,谁知道呢
【解决方案2】:

所以,经过一番挖掘后,我发现因为我已经从最初使用 IdentityUser 时创建了 AspNetUsers 表,所以我需要删除现有的本地数据库以避免可能的表冲突。不幸的是,添加并成功应用迁移并不是答案

【讨论】:

  • ApplicationUser 类是否继承自 IdentityUser ?
  • 是的,它继承自 IdentityUser。我只是不知道为什么添加迁移还不够,顺便说一句,在应用时没有产生任何错误。唯一的方法是删除数据库,我看到它也发生在其他人身上
  • 所以至少它现在有效。如果您知道这背后的根本原因,请保持更新此线程。 :)
  • @FerasTaleb 会做 =)
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2021-11-23
  • 2020-09-10
  • 2019-03-24
  • 1970-01-01
相关资源
最近更新 更多