首页 > 解决方案 > Asp.Net 核心身份 - UserManager.Users.Any() 总是返回 false

问题描述

这是我第一次尝试创建 IDP。我选择使用 Asp.Net Core Identity (3.1.4) 和 IdentityServer4 (3.1.3)。刚开始使用. IdentityUser_ApplicationUserApplicationUserIdentityUser

所以,我替换了我使用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();
    }
}

如果您想查看IdentityServer 和 net core Identitystartup.csConfigureServices的内容,这里是:

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();

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

标签: c#identityserver4asp.net-core-identity

解决方案


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

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

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


推荐阅读