zoukankan      html  css  js  c++  java
  • (三)IdentityServer4 结合 Mysql 之初体验

    前面写的示例中,IdeneityServer 使用的是内存缓存的存储方式,所有的配置都写在Config.cs里。在实际应用中,应该使用数据库存储方式,方便随时配置,如添加新的用户、资源、客户端,也可以节省服务器内存。

    本文从三个方面来实现 IdentityServer4 结合 Mysql 从而实现数据库存储方式,分别是客户端及资源数据、令牌及授权码数据以及用户数据。

    一、核心

    这里的核心是有三个上下文:

    1. 配置数据(资源、客户端、身份)对应配置上下文 ConfigurationDbContext(负责数据库中对客户端、资源和 CORS 设置的配置存储);

    2. 操作数据(令牌,代码和用户的授权信息 consents)对应操作上下文 PersistedGrantDbContext(负责存储同意、授权代码、刷新令牌和引用令牌);

    3. 用户数据(用户,角色,Claim)对应用户上下文 ApplicationDbContext(实现 User、Role、Claim 之间交互)。

    前两个在 IdentityServer4 中已经封装好了,第三个可以自定义 ApplicationDbContext 继承 NetCore 自带的 Identity 认证机制,也可以不继承自定义表结构。

    二、准备内容

    mysql 数据库
    
    Nuget 所需包
    IdentityServer4
    IdentityServer4.EntityFramework
    IdentityServer4.AspNetIdentity Pomelo.EntityFrameworkCore.MySql Microsoft.EntityFrameworkCore.Tools 新建 appsettings.json 文件添加数据库连接字符串 {
    "ConnectionStrings": { "SSOConnection": "server=ipAddress;userid=root;pwd=Password;database=DB;" } }

    1.初始化及构造

    public IConfiguration Configuration { get; }
    public IHostingEnvironment Environment { get; }
    
    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    {
        Configuration = configuration;
        Environment = environment;
    }

    2.定义数据库连接及获取项目名称

    string connectionString = Configuration.GetConnectionString("SSOConnection");
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

    3.注释 AddInMemory 方式

    AddInMemoryIdentityResources(Config.GetIdentityResources())
    AddInMemoryApiResources(Config.GetApis())
    AddInMemoryClients(Config.GetClients())

    三、客户端和资源的数据库存储

    前文我们使用的是 AddInMemory 的方式加载配置数据,接下来使用数据库连接方式加载配置数据

    1.添加 AddConfigurationStore

    .AddConfigurationStore(opt =>
    {
        opt.ConfigureDbContext = context =>
        {
            context.UseMySql(connectionString, sql =>
            {
                sql.MigrationsAssembly(migrationsAssembly);
            });
        };
    })

    2.配置客户端和资源数据表,把项目设为启动项目,打开程序包管理器控制台,控制台设置默认项目,在控制台执行以下指令添加数据表

    Add-Migration InitConfiguration -Context ConfigurationDbContext -o DateMigrationsIdentityServerConfiguragtionDb

    四、令牌和授权码的数据库存储

    1.添加 AddOperationalStore

    .AddOperationalStore(opt =>
    {
        opt.ConfigureDbContext = context =>
        {
            context.UseMySql(connectionString, sql =>
            {
                sql.MigrationsAssembly(migrationsAssembly);
            });
        };
        opt.EnableTokenCleanup = true;
        opt.TokenCleanupInterval = 30;
    })

    2.配置令牌和授权码数据表,把项目设为启动项目,打开程序包管理器控制台,控制台设置默认项目,在控制台执行以下指令添加数据表

    Add-Migration InitConfiguration -Context PersistedGrantDbContext -o DateMigrationsIdentityServerPersistedGrantDb

    五、用户数据

    1.添加 AddAspNetIdentity

    .AddAspNetIdentity<ApplicationUser>()

    2.添加系统配置(在数据库连接定义后添加)

    // 数据库配置系统应用用户数据上下文
    services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connectionString));
    
    // 启用 Identity 服务 添加指定的用户和角色类型的默认标识系统配置
    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    3.自定义 ApplicationDbContext 类,继承 NetCore 自带的 Identity 认证机制(也可以不继承而自定义表结构)

    // 定义用户管理上下文,继承 NetCore 自带的 Identity 认证机制,也可以不继承而自定义表结构。
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                    : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }
    
    public class ApplicationUser : IdentityUser
    {
        //可以在这里扩展,下文会说到
    }

    六、创建数据表

    上述操作将会在 Startup.cs 中配置三个上下文,以及进行 Migrations 迁移,接下来分别执行以下语句将 Migrations 迁移的表创建到数据库中

    Update-Database -Context PersistedGrantDbContext
    update-database -context ConfigurationDbContext
    Update-Database -Context ApplicationDbContext

    七、将配置数据写入数据库

    Migrations 迁移后数据库会生成三个上下文对应的数据表,接下来将把 Config.cs 中已配置的数据生成到数据库中去

    未完待续...

  • 相关阅读:
    创建SSIS包—ETL中典型的数据清洗
    SSIS中的容器和数据流—数据转换(Transformations)
    创建SSIS包—循环和动态package
    SSIS中的容器和数据流—数据转换(Transformations)续
    创建SSIS包—建立端到端的package
    SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
    SSIS中的容器和数据流—调试工具数据视图
    SQL点滴11—重置win7登录密码影响SQL登录
    SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
    SSIS中的容器和数据流—举例说明数据转换任务
  • 原文地址:https://www.cnblogs.com/chendongbky/p/12700339.html
Copyright © 2011-2022 走看看