IdentityServer4认证服务器集成Identity&配置持久化数据库

摘要:
asp.netcore的空web项目集成了相关的dll和页面文件配置IdnetityServer4身份验证服务器。首先,使用netcore 2.2版创建一个空项目,如下图所示。介绍IdentityServer4和IdentityServer 4、Identity服务器4的相关Nuget包。AspNetIdentity,IdentityServer4。EntityFramework,Microsoft.EntityFrameworkCore.Sqlite.首先,修改ConfigureServices方法以注释掉从Config.cs获取客户端和资源的方法
文章简介
  • asp.net core的空Web项目集成相关dll和页面文件配置IdnetityServer4认证服务器

  • Ids4集成Identity

  • Ids4配置持久化到数据库

写在最前面,此文章不详细讲述IdentityServer4的各个组成部分以及Oauth2相关知识,需要了解详细相关知识的,可以移步我的其他几篇博客(初探IdentityServer4),腾讯视频有Dave老师录制的详细教程(http://v.qq.com/vplus/4cfb00af75c16eb8d198c58fb86eb4dc?page=video)。

asp.net core的空Web项目集成相关dll和页面文件配置IdnetityServer4认证服务器

  1. 首先创建一个net core版本为2.2的空项目,如下图所示。引入IdntityServer4和Identity的相关Nuget包 IdentityServer4,IdentityServer4.AspNetIdentity,IdentityServer4.EntityFramework,Microsoft.EntityFrameworkCore.Sqlite(数据库我们用Sqlite)。入下图所示IdentityServer4认证服务器集成Identity&配置持久化数据库第1张IdentityServer4认证服务器集成Identity&配置持久化数据库第2张
  2. 添加静态文件(wwwroot)和IdentityServer4的登录UI以及控制器相关类(官方文档的Quickstart),添加一个IdentityResource,ApiResource,和Client配置的Config类;因为Quickstart中用到的User类是继承自IdnetityUser的ApplicationUser,所以我们添加一个ApplicationUser类;项目路径是这样的:IdentityServer4认证服务器集成Identity&配置持久化数据库第3张
  3. 接下来我们配置startup文件,这样,基于内存配置的(Config文件)我们的IdentityServer4认证服务器就搭好了
    IdentityServer4认证服务器集成Identity&配置持久化数据库第4张IdentityServer4认证服务器集成Identity&配置持久化数据库第5张
     1     public class Startup
     2     {
     3         public IConfiguration Configuration { get; }
     4         public IHostingEnvironment Environment { get; }
     5         public Startup(IConfiguration configuration, IHostingEnvironment environment)
     6         {
     7             Configuration = configuration;
     8             Environment = environment;
     9         }
    10         public void ConfigureServices(IServiceCollection services)
    11         {
    12             services.AddMvcCore()
    13            .AddAuthorization()
    14            .AddJsonFormatters();
    15 
    16             services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_1);
    17 
    18 
    19 
    20             services.Configure<IISOptions>(iis =>
    21             {
    22                 iis.AuthenticationDisplayName = "Windows";
    23                 iis.AutomaticAuthentication = false;
    24             });
    25 
    26            
    27             var builder = services.AddIdentityServer(options =>
    28             {
    29                 options.Events.RaiseErrorEvents = true;
    30                 options.Events.RaiseInformationEvents = true;
    31                 options.Events.RaiseFailureEvents = true;
    32                 options.Events.RaiseSuccessEvents = true;
    33             })
    34                 .AddInMemoryIdentityResources(Config.GetIdentityResources())
    35                 .AddInMemoryApiResources(Config.GetApis())
    36                 .AddInMemoryClients(Config.GetClients())
    37                 .AddTestUsers(Config.GetUsers());
    38 
    39             if (Environment.IsDevelopment())
    40             {
    41                 builder.AddDeveloperSigningCredential();
    42             }
    43             else
    44             {
    45                 throw new Exception("need to configure key material");
    46             }
    47         }
    48         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    49         {
    50             if (Environment.IsDevelopment())
    51             {
    52                 app.UseDeveloperExceptionPage();
    53                 app.UseDatabaseErrorPage();
    54             }
    55             else
    56             {
    57                 app.UseExceptionHandler("/Home/Error");
    58             }
    59             app.UseStaticFiles();
    60             app.UseMvcWithDefaultRoute();
    61         }
    62            
    63         }
    64     }
    View Code

Ids4集成Identity

  1. 首先,添加一个数据库上下文,这里我们使用sqlite数据库,在项目根路径下添加一个叫做identity.db的文件,再在配置文件中,添加数据库链接字符串
    IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第4张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第7张
    1     public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    2     {
    3         public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
    4         protected override void OnModelCreating(ModelBuilder builder)
    5         {
    6             base.OnModelCreating(builder);
    7         }
    8     }
    View Code
    IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第4张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第9张
    1 {
    2   "ConnectionStrings": {
    3     "DefaultConnection": "Data Source=identity.db;"
    4   }
    5 }
    View Code
  2. 添加Identity的项目基架,选择上一步添加的数据库链接上下文IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第10张
  3. 修改startup,配置Idnetity相关信息IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第11张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第12张
  4. 最后,添加Identity的数据库迁移文件,更新数据库

    IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第4张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第14张
    1 Add-Migration CreateIdentitySchema
    2 
    3 Update-Database
    迁移命令

Ids4配置持久化到数据库

  1. 到现在为止,我们已经把Identity集成到IdentityServer4认证服务器中去了,但是我们的保护资源配置(Config.cs),还是在内存中静态的存在,接下来,我们把它持久化到数据库中。首先,修改ConfigureServices方法,将从Config.cs中获取Client和Resource的方法注释掉,替换成下图所示,其中ConfigurationStore包含了Cient,ApiResource,IdentityResource等信息,OperationalStore包含了用户登录时候生成的token信息IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第15张
  2. 将Config中的配置信息写入到数据库中去
    IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第4张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第17张
     1         private void InitializeDatabase(IApplicationBuilder app)
     2         {
     3             using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
     4             {
     5                 serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
     6 
     7                 var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
     8                 context.Database.Migrate();
     9                 if (!context.Clients.Any())
    10                 {
    11                     foreach (var client in Config.GetClients())
    12                     {
    13                         context.Clients.Add(client.ToEntity());
    14                     }
    15                     context.SaveChanges();
    16                 }
    17                 if (!context.IdentityResources.Any())
    18                 {
    19                     foreach (var resource in Config.GetIdentityResources())
    20                     {
    21                         context.IdentityResources.Add(resource.ToEntity());
    22                     }
    23                     context.SaveChanges();
    24                 }
    25                 if (!context.ApiResources.Any())
    26                 {
    27                     foreach (var resource in Config.GetApis())
    28                     {
    29                         context.ApiResources.Add(resource.ToEntity());
    30                     }
    31                     context.SaveChanges();
    32                 }
    33             }
    34         }
    View Code
  3. 分别为两个数据库上下文执行数据库迁移命令,此时,数据库中将多出这样几张表,红色的框是ConfigurationDbContext生成的,绿的框是PersistedGrantDbContext生成的。最后别忘了把初始化配置种子数据的方法(InitializeDatabase)放到Configure执行下
    IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第4张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第19张
     1         private void InitializeDatabase(IApplicationBuilder app)
     2         {
     3             using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
     4             {
     5                 serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
     6 
     7                 var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
     8                 context.Database.Migrate();
     9                 if (!context.Clients.Any())
    10                 {
    11                     foreach (var client in Config.GetClients())
    12                     {
    13                         context.Clients.Add(client.ToEntity());
    14                     }
    15                     context.SaveChanges();
    16                 }
    17                 if (!context.IdentityResources.Any())
    18                 {
    19                     foreach (var resource in Config.GetIdentityResources())
    20                     {
    21                         context.IdentityResources.Add(resource.ToEntity());
    22                     }
    23                     context.SaveChanges();
    24                 }
    25                 if (!context.ApiResources.Any())
    26                 {
    27                     foreach (var resource in Config.GetApis())
    28                     {
    29                         context.ApiResources.Add(resource.ToEntity());
    30                     }
    31                     context.SaveChanges();
    32                 }
    33             }
    34         }
    配置持久化的迁移文件IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第20张
  4. 最后,运行起来看下效果:我们注册一个用户,登录下IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第21张IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第22张

     IdentityServer4认证服务器集成Identity&amp;配置持久化数据库第23张

  5. 示例Demo=》https://github.com/madeinchinalmc/IdentityServer4Sample.git

免责声明:文章转载自《IdentityServer4认证服务器集成Identity&amp;amp;配置持久化数据库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tomacat7.0配置(windows)Openfire验证机制的修改(整合自定义用户表)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

git config配置

在git中,我们使用git config 命令用来配置git的配置文件,git配置级别主要有以下3类: 1、仓库级别 local 【优先级最高】 2、用户级别 global【优先级次之】 3、系统级别 system【优先级最低】 通常: git 仓库级别对应的配置文件是当前仓库下的.git/config 【在当前目录下.git目录默认是隐藏的,所以在文件管...

Android 6.0 动态申请 音频+拍照+相册 权限

1.音频的权限(包括录音和播放) 1.1.首先要在清单中加上两个权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD...

20万DBA都在关注的12个问题 [转载]

引言 近期我们在DBASK小程序新关联了韩锋频道、互联网侦察、数据库SQL、SQL数据库开发、跨界架构师、石杉的架构笔记等数据领域的公众号,聚合更新展示,欢迎大家阅读分享。 问答集萃 接下来,我们分享本期整理出的问题和诊断总结,供大家参考学习,详细的诊断分析过程可以通过标题链接跳转到小程序中查看。 问题一、Windows 系统是否需要设置filesyste...

[教程]Oracle 11g Express 安装和使用教程

使用工具的第一步就是安装工具,配置环境!下面就Oracle 11g Express的安装和简单实用做一简介。 一.下载安装过程去oracle的官网下载Oracle 11g express,大概300MB,下载完成后解压,打开后大致如下图 打开setup开始安装,为了保证安装成功,可以右键点击setup,选择用管理员权限运行。 点击下一步; 将目标文件...

mysql入门(一)

数据库介绍 数据库是在计算机出现以后,为了解决计算机存储问题而创建,数据库中包含表,表当中才是数据。 数据库的发展史 1. 萌芽阶段 所有存储依赖的都是文件,安全性低,查找非常困难。 2. 层次模型 1). 优点:查询分类的效率高; 2). 缺点:导航结构:如果查找同类别数据,效率低。 数据不完整(如下图) 3. 网状模型 数据不完整性:我们认为每一行数...

oracle数据库割接解决方案一

一、需求 1、由于新版本上线替换旧版本、两个版本互不兼容、数据库里面有些表不一致,比如表名、字段等等。 2、要全部保留旧数据库里面的数据信息,同时要保证数据唯一性、正确性、可靠性--完整性。 3、新版本在数据切割后可以正常运行,整个系统的功能正常、计费正确等。 二、根据需求,下面将对解决方案进行分解: 1、由于旧数据库的编码是gbk,而新的数据库是utf-...