#c# #asp.net-core #identityserver4
#c# #asp.net-core #identityserver4
Вопрос:
Я в основном следовал всему руководству с нуля, не считая пропуска javascript-клиента. Тем не менее, я скопировал некоторый код из примера Asp.Net Identity EF Core объединены, и база данных со всеми таблицами была создана успешно. Однако, когда я запускаю сервер идентификации, нет начального значения. Я отлаживал program.cs, и начальный параметр всегда равен false, что делает его пропускающим начальное условие.
public class Program
{
public static void Main(string[] args)
{
var seed = args.Any(x => x == "/seed");
if (seed) args = args.Except(new[] { "/seed" }).ToArray();
var host = CreateWebHostBuilder(args).Build();
if (seed)
{
using (var scope = host.Services.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
SeedData.EnsureSeedData(scope.ServiceProvider);
return;
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
это начальный класс данных, такой же, как в примере
public class SeedData
{
public static void EnsureSeedData(IServiceProvider provider)
{
provider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
provider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
provider.GetRequiredService<ConfigurationDbContext>().Database.Migrate();
{
var userMgr = provider.GetRequiredService<UserManager<ApplicationUser>>();
var alice = userMgr.FindByNameAsync("alice").Resu<
if (alice== null)
{
alice = new ApplicationUser
{
UserName = "alice"
};
var result = userMgr.CreateAsync(alice, "Pass123$").Result
if (!result.Succeeded)
{
throw new Exception(result.Errors.First().Description);
}
alice = userMgr.FindByNameAsync("alice").Resu<
result = userMgr.AddClaimsAsync(user, new Claim[]{
new Claim(JwtClaimTypes.Subject, "1"),
new Claim(JwtClaimTypes.Name, "Alice Smith"),
new Claim(JwtClaimTypes.GivenName, "Alice"),
new Claim(JwtClaimTypes.FamilyName, "Smith"),
new Claim(JwtClaimTypes.Email, "AliceSmith@email.com"),
new Claim(JwtClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean),
new Claim(JwtClaimTypes.Role, "Admin")
}).Resu<
if (!result.Succeeded)
{
throw new Exception(result.Errors.First().Description);
}
Console.WriteLine("user created");
}
else
{
Console.WriteLine("user already exists");
}
}
{
var context = provider.GetRequiredService<ConfigurationDbContext>();
if (!context.Clients.Any())
{
foreach (var client in Config.GetClients())
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
}
if (!context.IdentityResources.Any())
{
foreach (var resource in Config.GetIdentityResources())
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
if (!context.ApiResources.Any())
{
foreach (var resource in Config.GetApis())
{
context.ApiResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
}
}
чего я не понимаю? Весь код одинаков, класс запуска тоже и т.д…
Комментарии:
1. dotnet запускает program.cs /seed
Ответ №1:
Для прохождения string[] args
вам нужно запустить project с помощью Project.exe
вместо IIS Express
.
Следуйте свойствам проекта-> Отладка-> Аргументы приложения-> /seed
-> Запустить проект из ProjectName
.
В общем, вы можете рассмотреть возможность принятия решения о заполнении данных путем проверки наличия каких-либо данных в базе данных, а не из аргументов команды.