IdentityServer4認證服務器集成Identity&配置持久化數據庫

文章簡介

  • asp.net core的空Web項目集成相關dll和頁面文件配置IdnetityServer4認證服務器

  • Ids4集成Identity

  • Ids4配置持久化到數據庫

寫在最前面,此文章不詳細講述IdentityServer4的各個組成部分以及Oauth2相關知識,須要瞭解詳細相關知識的,能夠移步個人其餘幾篇博客(初探IdentityServer4),騰訊視頻有Dave老師錄製的詳細教程(http://v.qq.com/vplus/4cfb00af75c16eb8d198c58fb86eb4dc?page=video)。git

asp.net core的空Web項目集成相關dll和頁面文件配置IdnetityServer4認證服務器

  1. 首先建立一個net core版本爲2.2的空項目,以下圖所示。引入IdntityServer4和Identity的相關Nuget包 IdentityServer4,IdentityServer4.AspNetIdentity,IdentityServer4.EntityFramework,Microsoft.EntityFrameworkCore.Sqlite(數據庫咱們用Sqlite)。入下圖所示
  2. 添加靜態文件(wwwroot)和IdentityServer4的登陸UI以及控制器相關類(官方文檔的Quickstart),添加一個IdentityResource,ApiResource,和Client配置的Config類;由於Quickstart中用到的User類是繼承自IdnetityUser的ApplicationUser,因此咱們添加一個ApplicationUser類;項目路徑是這樣的:
  3. 接下來咱們配置startup文件,這樣,基於內存配置的(Config文件)咱們的IdentityServer4認證服務器就搭好了
     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的文件,再在配置文件中,添加數據庫連接字符串
    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
    1 {
    2   "ConnectionStrings": {
    3     "DefaultConnection": "Data Source=identity.db;"
    4   }
    5 }
    View Code
  2. 添加Identity的項目基架,選擇上一步添加的數據庫連接上下文
  3. 修改startup,配置Idnetity相關信息
  4. 最後,添加Identity的數據庫遷移文件,更新數據庫github

    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信息
  2. 將Config中的配置信息寫入到數據庫中去
     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執行下
     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         }
    配置持久化的遷移文件
  4. 最後,運行起來看下效果:咱們註冊一個用戶,登陸下

     

     

     

  5. 示例Demo=》https://github.com/madeinchinalmc/IdentityServer4Sample.git
相關文章
相關標籤/搜索