Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IdentityServer 4如何注册用户和管理资源_C#_Asp.net_Asp.net Identity_Entity Framework Core_Identityserver4 - Fatal编程技术网

C# IdentityServer 4如何注册用户和管理资源

C# IdentityServer 4如何注册用户和管理资源,c#,asp.net,asp.net-identity,entity-framework-core,identityserver4,C#,Asp.net,Asp.net Identity,Entity Framework Core,Identityserver4,我计划使用IdentityServer4处理多个项目的身份验证/授权(每个项目都有自己的WebAPI)。因此,用户可能需要注册一次,并获得他们有权访问的产品/api的标志或角色 我已经阅读了IdentityServer4文档,并从InMemoryUsers开始,现在我将InMemoryUsers更改为IdentityUsers,并使用实体框架核心 // Adds Identity - configure identity server services.AddIdenti

我计划使用IdentityServer4处理多个项目的身份验证/授权(每个项目都有自己的WebAPI)。因此,用户可能需要注册一次,并获得他们有权访问的产品/api的标志或角色

我已经阅读了IdentityServer4文档,并从InMemoryUsers开始,现在我将InMemoryUsers更改为IdentityUsers,并使用实体框架核心

        // 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>();
//添加标识-配置标识服务器
services.AddIdentityServer()
//.AddSigningCredential(密钥、StoreLocation.LocalMachine、NameType.Thumbprint)
.AddTemporarySigningCredential()
.AddConfigurationStore(builder=>builder.UseSqlServer(connectionString,options=>options.MigrationAssembly(MigrationAssembly)))
.AddOperationalStore(builder=>builder.UseSqlServer(connectionString,options=>options.MigrationsAssembly(MigrationsAssembly)))
.addAsNetIdentity();
所以我在前面提到的线程中创建了三个不同的项目

  • 身份提供商=Asp.Net身份项目(可以是用户注册的公司网站)
  • Identity Server=包含Identity Server中间件的Asp.Net项目
  • 受保护的API=Web API
我还必须提到,我使用的是实体框架核心1.1.1

但是现在问题来了,如何处理来自不同项目的数据库访问? 身份提供程序身份服务器当前正在使用同一数据库。这两个项目都启用了迁移,但这是对的吗?

  • 所以我的第一个问题是,处理两次迁移到同一数据源不是一个问题吗?(在EntityFrameworkCore中,迁移似乎不会自动执行——这很好——迁移必须手动执行)
  • 建议采用哪种方式来处理IdentityServer4的客户端、API资源、声明、作用域等?我是否应该创建一个额外的项目,它也使用相同的数据库来管理配置数据
  • 因此,我不知道如何处理对不同Asp.Net项目中具有EntityFramework核心的一个数据库的数据库访问。 我的数据库当前如下所示:

    以下代码将在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();
                        }
                    }
                }
            }
    
    private void InitializeDbTestData(IAApplicationBuilder应用程序)
    { 
    使用(var serviceScope=app.ApplicationServices.GetService().CreateScope())
    { 
    //创建identity server EF结构
    serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
    serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
    serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
    var context=serviceScope.ServiceProvider.GetRequiredService();
    //添加虚拟/示例数据
    如果(!context.Clients.Any())
    {
    foreach(ExampleConfig.GetClients()中的var客户端)
    context.Clients.Add(client.ToEntity());
    SaveChanges();
    }
    如果(!context.IdentityResources.Any())
    {
    foreach(ExampleConfig.GetIdentityResource()中的var资源)
    Add(resource.ToEntity());
    SaveChanges();
    }
    如果(!context.ApiResources.Any())
    {
    foreach(ExampleConfig.GetApiResources()中的var apiResource)
    Add(apiResource.ToEntity());
    SaveChanges();
    }
    var userManager=serviceScope.ServiceProvider.GetRequiredService();
    如果(!userManager.Users.Any())
    {
    foreach(ExampleConfig.GetUsers()中的var testUser)
    {
    var identityUser=new identityUser(testUser.Username)
    {
    Id=testUser.SubjectId,
    UserName=testUser.UserName,
    Email=testUser.Username,
    emailconfirm=false
    };
    foreach(testUser.Claims中的var声明)
    {
    identityUser.Claims.Add(新的IdentityUserClaim
    {
    UserId=identityUser.Id,
    ClaimType=索赔类型,
    ClaimValue=索赔价值
    });
    }
    CreateAsync(identityUser,“Password123!”).Wait();
    }
    }
    }
    }
    
    我希望我能把我的问题描述得通俗易懂,并且我希望格式符合指南。 我真的很感谢你的帮助。
    向Michael致以最良好的问候

    只要将模型分开,在一个数据库中进行多次迁移应该不会有问题。至于配置,我认为这主要取决于可访问性。如果您想限制访问(因为身份服务器是可公开访问的),那么考虑创建自己的允许本地访问(仅在您的网络中)的项目。谢谢您的答复。好吧,但这不是我担心的重点。我担心在指向同一个数据库的不同项目中有相同或几乎相同的数据库上下文。因为如果我在一个项目中迁移新的表或列,我必须始终关注另一个项目。你觉得怎么样