C# IdentityServer 4如何注册用户和管理资源
我计划使用IdentityServer4处理多个项目的身份验证/授权(每个项目都有自己的WebAPI)。因此,用户可能需要注册一次,并获得他们有权访问的产品/api的标志或角色 我已经阅读了IdentityServer4文档,并从InMemoryUsers开始,现在我将InMemoryUsers更改为IdentityUsers,并使用实体框架核心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
// 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
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致以最良好的问候只要将模型分开,在一个数据库中进行多次迁移应该不会有问题。至于配置,我认为这主要取决于可访问性。如果您想限制访问(因为身份服务器是可公开访问的),那么考虑创建自己的允许本地访问(仅在您的网络中)的项目。谢谢您的答复。好吧,但这不是我担心的重点。我担心在指向同一个数据库的不同项目中有相同或几乎相同的数据库上下文。因为如果我在一个项目中迁移新的表或列,我必须始终关注另一个项目。你觉得怎么样