这是我第一次尝试创建IDP。我选择使用Asp.Net Core Identity(3.1.4)和IdentityServer4(3.1.3)来完成此操作。刚开始使用IdentityUser
时,一切工作都很好,但是昨天我想向用户添加一些属性,因此我决定添加一个类ApplicationUser
来保存这些属性,ApplicationUser
当然是从[ C0]。
因此,我将使用IdentityUser
的所有实例替换为IdentityUser
,并认为这已经结束了。但是今天,当我尝试编译以测试我的工作时,我发现在创建之后将用户添加到数据库中的种子方法并没有找到任何用户,因此总是尝试一次又一次地添加相同的用户。
我发现这段代码无法正常工作。从现在开始,尽管已经在数据库中创建了3个用户,但它始终给我ApplicationUser
。尽管我必须说用户是在将false
添加到项目中之前创建的。
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和网络核心身份中查看startup.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
有什么想法吗?如果可能,我希望避免破坏和重新创建数据库。
您提到您使用ApplicationUser类添加了更多属性。
如果使用代码优先迁移,则应使用ef add migration命令。和更新数据库方案。我只是假设您忘记了进行迁移:)
换句话说,请确保您的ApplicationUser在字段方面与AspNetUsers表保持同步。
因此,经过进一步的挖掘,我发现由于我从最初使用IdentityUser时就已经创建了AspNetUsers表,因此我需要删除现有的本地数据库以避免可能的表冲突。不幸的是,添加并成功应用迁移不是答案