我打算使用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 ProviderIdentity 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();
                    }
                }
            }
        }

我希望我能描述我的问题是可理解的,我希望格式符合指南 . 我非常感谢你的帮助 . 最好的问候迈克尔