一、前言
通过持久化,框架为我们准备了两个上下文:
用户持久化可以自定义一套逻辑,但是,我们直接使用微软的,然后新建一个用户上下文:
二、持久化1、新的认证服务
新建一个MVC项目,目录结构和上一个一样大致相同。安装所需的包:
2、新用户上下文
//IdentityUser实际肯定是需要拓展的,还有一些自定义等功能,Demo这儿就不费劲了,随后要挪到正式的环境,用到再细说
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
3、.cs 配置持久化
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//读取数据库连接
var connectionString = Configuration.GetSection("DB").Value;
if (connectionString == "")
{
throw new Exception("数据库配置异常");
}
/**********************************IdentityServer4持久化配置**********************************/
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
//添加用户数据上下文 ApplicationDbContext
services.AddDbContext(options => options.UseNpgsql(connectionString));
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
//添加配置数据上下文 ConfigurationDbContext、操作数据上下文 PersistedGrantDbContext、用户持久化
var builder = services.AddIdentityServer()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = builder =>
{
builder.UseNpgsql(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
};
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder =>
{
builder.UseNpgsql(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
};
//token配置
options.EnableTokenCleanup = true;
options.TokenCleanupInterval = 30;
})
.AddAspNetIdentity()
.AddDeveloperSigningCredential();
}
4、迁移到数据库
包管理器控制台,依次输入以下命令并回车:
数据库表、ER关系图
5、初始化种子数据
新建一个.cs,初始化种子数据,在.cs中配置好后使用内存数据
public class SeedData
{
public static void InitData(IApplicationBuilder serviceProvider)
{
using (var scope = serviceProvider.ApplicationServices.CreateScope())
{
//初始化种子数据:配置、资源、客户端等
scope.ServiceProvider.GetRequiredService().Database.Migrate();
{
var context = scope.ServiceProvider.GetRequiredService();
context.Database.Migrate();
InitSeedData(context);
}
//初始化种子数据:用户
{
var context = scope.ServiceProvider.GetRequiredService();
context.Database.Migrate();
var userManager = scope.ServiceProvider.GetRequiredService<UserManager>();
foreach (var user in InMemoryConfig.GetTestUser())
{
var find = userManager.FindByNameAsync(user.Username).Result;
if (find == null)
{
IdentityUser u = new IdentityUser() { UserName = user.Username };
//密码格式严格(至少一个非字母字符、至少一位0-9数字)
var ret = userManager.CreateAsync(u, "WinterSir123!").Result;
if (ret.Succeeded)
{
userManager.AddClaimsAsync(u, user.Claims);
}
}
}
}
}
}
private static void InitSeedData(ConfigurationDbContext context)
{
if (!context.Clients.Any())
{
foreach (var client in InMemoryConfig.GetClients())
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
}
if (!context.IdentityResources.Any())
{
foreach (var resource in InMemoryConfig.IdentityResources)
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
if (!context.ApiResources.Any())
{
foreach (var resource in InMemoryConfig.GetApiResources())
{
context.ApiResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
if (!context.ApiScopes.Any())
{
foreach (var resource in InMemoryConfig.GetApiScopes())
{
context.ApiScopes.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
}
调用代码放在这里,认证服务启动时初始化,之前的内存模式配置持久化到数据库中
6、修改登录和注销代码**
实际上,我不明白为什么我需要更改登录部分。一般采用框架提供的方法。百度和谷歌不解。 @
三、渲染
**您可以看到我们必须使用新密码!登录,匹配的是数据库中已经持久化的信息
四、前人种树,后人乘凉
五、代码已上传
© 版权声明
本站下载的源码均来自公开网络收集转发二次开发而来,
若侵犯了您的合法权益,请来信通知我们1413333033@qq.com,
我们会及时删除,给您带来的不便,我们深表歉意。
下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,访问及下载者下载默认同意本站声明的免责申明,请合理使用切勿商用。
THE END
暂无评论内容