c# - Asp.Net 核心身份 - UserManager.Users.Any() 总是返回 false
问题描述
这是我第一次尝试创建 IDP。我选择使用 Asp.Net Core Identity (3.1.4) 和 IdentityServer4 (3.1.3)。刚开始使用. IdentityUser
_ApplicationUser
ApplicationUser
IdentityUser
所以,我替换了我使用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.cs
中ConfigureServices
的内容,这里是:
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();
有任何想法吗?如果可能的话,我想避免销毁和重新创建数据库。
解决方案
您提到您使用 ApplicationUser 类来添加更多属性。
如果您使用 Code First 迁移,则应使用 ef add migration 命令。和更新数据库方案。我只是假设您忘记进行迁移:)
换句话说,请确保您的 ApplicationUser 在字段方面与 AspNetUsers 表同步。