初始化数据库
SeedData
SeedData 中的代码用于在数据库初始化两个 ApplicationUser。
在 Program 的 Main 方法中进行调用:
public static void Main(string[] args)
{
var seed = args.Any(x => x == "/seed");
if (seed) args = args.Except(new[] { "/seed" }).ToArray();
var host = BuildWebHost(args);
if (seed)
{
SeedData.EnsureSeedData(host.Services);
return;
}
host.Run();
}
dotnet run /seed
SELECT * FROM archdb_dev.public.”AspNetUsers”;
查看生成的数据:
还有 Claims
InitializeDatabase
在 Startup.cs 中添加 InitializeDatabase 方法,并在 Configure 中调用:
public void Configure(IApplicationBuilder app)
{
InitializeDatabase(app);
if (Environment.IsDevelopment())
...
}
private void InitializeDatabase(IApplicationBuilder app)
{
// Using a services scope
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
// Create PersistedGrant Database (we're using a single db here)
var persistedGrantDbContext = serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>();
persistedGrantDbContext.Database.Migrate();
// Create IdentityServer4 Configuration Database
var configDbContext = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
configDbContext.Database.Migrate();
// Generate records corresponding to the clients
if (!configDbContext.Clients.Any())
{
foreach (var client in Config.GetClients())
{
configDbContext.Clients.Add(client.ToEntity());
}
configDbContext.SaveChanges();
}
// Generate records corresponding to the identity resources
if (!configDbContext.IdentityResources.Any())
{
foreach (var res in Config.GetIdentityResources())
{
configDbContext.IdentityResources.Add(res.ToEntity());
}
configDbContext.SaveChanges();
}
// Generate records corresponding to the api resources
if (!configDbContext.ApiResources.Any())
{
foreach (var api in Config.GetApis())
{
configDbContext.ApiResources.Add(api.ToEntity());
}
configDbContext.SaveChanges();
}
}
}
启动 IdentityServer4
Google 也用了相似的协议:https://accounts.google.com/.well-known/openid-configuration
可以通过刚才创建的 Alice 和 Bob 进行登录:
可以在控制台通过 Log 看到发生的一切操作:
建议阅读 IdentityServer4 的文档。
IdentityServer is middleware that adds the spec compliant OpenID Connect and OAuth 2.0 endpoints to an arbitrary ASP.NET Core application.
如果还有兴趣,也推荐参阅 OAuth 2.0。
OAuth 深度相对比较深,但也能更清晰的阐释 IdentityServer4 的底层实现和诸多问题的解决方案。
如果对整体实现还有兴趣,还可以去参阅 OpenID。