我打算使用IdentityServer4来处理多个项目的身份验证/授权(每个项目都有自己的WebAPI) . 因此,用户可能必须注册一次并获得他们可以访问的产品/ API的标记或角色 .
我已经通过IdentityServer4文档并开始使用InMemoryUsers,我现在更改为 IdentityUser ,其中包含 Entity Framework Core
// Adds Identity - configure identity server
services.AddIdentityServer()
// .AddSigningCredential(key, StoreLocation.LocalMachine, NameType.Thumbprint)
.AddTemporarySigningCredential()
.AddConfigurationStore(builder => builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(migrationsAssembly)))
.AddOperationalStore(builder => builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(migrationsAssembly)))
.AddAspNetIdentity<IdentityUser>();
所以我在已经提到的线程User Registration Process with IdentityServer4中创建了三个不同的项目 .
-
Identity Provider = Asp.Net Identity项目(可以是公司网站,用户注册)
-
Identity Server =包含身份服务器中间件的Asp.Net项目
-
A protected API = Web Api
我还要提到我正在使用 Entity Framework Core 1.1.1 .
但现在问题出来了,如何处理来自不同项目的数据库访问? Identity Provider 和 Identity Server 当前正在使用相同的数据库 . 这两个项目都启用了迁移,但这可能是正确的吗? IdentityProvider with ApplicationDBContext and IdentityServer=OAuthService with ApplicationDBContext, both with Migration enabled
-
所以我的第一个问题是,处理两次迁移到同一数据源是不是一个问题? (似乎在Entity Framework Core中,不会自动执行 - 这很好 - 并且必须手动执行迁移)
-
建议使用哪种方式来处理IdentityServer4的客户端,API资源,声明,范围等?我是否应该创建一个额外的项目,它也使用相同的数据库来管理配置数据?
所以我不确定如何使用Entity Framework Core处理来自不同Asp.Net项目的数据库访问 . 我的数据库目前看起来像这样:IdentityServer database with Asp.Net Identities
以下代码将在SocialNet.OAuthService项目的 Startup.cs 内执行 .
private void InitializeDbTestData(IApplicationBuilder app)
{
using (var serviceScope = app.ApplicationServices.GetService().CreateScope())
{
// create identity server EF structures
serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
// add dummy/example data
if (!context.Clients.Any())
{
foreach (var client in ExampleConfig.GetClients())
context.Clients.Add(client.ToEntity());
context.SaveChanges();
}
if (!context.IdentityResources.Any())
{
foreach (var resource in ExampleConfig.GetIdentityResource())
context.IdentityResources.Add(resource.ToEntity());
context.SaveChanges();
}
if (!context.ApiResources.Any())
{
foreach (var apiResource in ExampleConfig.GetApiResources())
context.ApiResources.Add(apiResource.ToEntity());
context.SaveChanges();
}
var userManager = serviceScope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();
if (!userManager.Users.Any())
{
foreach (var testUser in ExampleConfig.GetUsers())
{
var identityUser = new IdentityUser(testUser.Username)
{
Id = testUser.SubjectId,
UserName = testUser.Username,
Email = testUser.Username,
EmailConfirmed = false
};
foreach (var claim in testUser.Claims)
{
identityUser.Claims.Add(new IdentityUserClaim<string>
{
UserId = identityUser.Id,
ClaimType = claim.Type,
ClaimValue = claim.Value
});
}
userManager.CreateAsync(identityUser, "Password123!").Wait();
}
}
}
}
我希望我能描述我的问题是可理解的,我希望格式符合指南 . 我非常感谢你的帮助 . 最好的问候迈克尔