diff --git a/Directory.Build.props b/Directory.Build.props index 1e4f97306..9516708f3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 1.0.1 + 1.1.0 Jan Škoruba Duende IdentityServer Admin OpenIDConnect OAuth2 Identity https://github.com/skoruba/Duende.IdentityServer.Admin/blob/main/LICENSE diff --git a/README.md b/README.md index 057a83b89..8afee74a9 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ [![Build status](https://ci.appveyor.com/api/projects/status/563ug5gcxk904m6g/branch/main?svg=true)](https://ci.appveyor.com/project/JanSkoruba/duende-identityserver-admin/branch/main) [![Join the chat at https://gitter.im/skoruba/IdentityServer4.Admin](https://badges.gitter.im/skoruba/IdentityServer4.Admin.svg)](https://gitter.im/skoruba/IdentityServer4.Admin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -The application is written in the **Asp.Net Core MVC - using .NET 5.0** +The application is written in the **Asp.Net Core MVC - using .NET 6.0** ## Requirements -- [Install](https://www.microsoft.com/net/download/windows#/current) the latest .NET 5 SDK (using older versions may lead to 502.5 errors when hosted on IIS or application exiting immediately after starting when self-hosted) +- [Install](https://www.microsoft.com/net/download/windows#/current) the latest .NET 6 SDK (using older versions may lead to 502.5 errors when hosted on IIS or application exiting immediately after starting when self-hosted) ## Installation via dotnet new template @@ -22,7 +22,7 @@ The application is written in the **Asp.Net Core MVC - using .NET 5.0** - 🔒 **NOTE:** The project uses the default database migrations which affect your database therefore double check the migrations according to your database provider and create a database backup ```sh -dotnet new -i Skoruba.Duende.IdentityServer.Admin.Templates::1.0.1 +dotnet new -i Skoruba.Duende.IdentityServer.Admin.Templates::1.1.0 ``` ### Create new project: @@ -376,7 +376,7 @@ Admin and STS can be customized without editing code in `appsettings.json` under Ui can be customized using themes integrated from [bootswatch](https://bootswatch.com). -From version 2.0.0 is possible to change theme from UI. 🎈 +It's possible to change theme from UI. 🎈 By default, configuration value is null to use default theme. if you want to use a theme, just fill the lowercase theme name as configuration value of `Theme` key. @@ -731,7 +731,8 @@ It is possible to define the configuration according the client type - by defaul - [x] Extract UI part into nuget package ([#770](https://github.com/skoruba/IdentityServer4.Admin/issues/770), [#409](https://github.com/skoruba/IdentityServer4.Admin/issues/409), [#55](https://github.com/skoruba/IdentityServer4.Admin/issues/55), [#322](https://github.com/skoruba/IdentityServer4.Admin/issues/322), [#28](https://github.com/skoruba/IdentityServer4.Admin/issues/28), [#133](https://github.com/skoruba/IdentityServer4.Admin/issues/133)) ### 1.1.0 -- [ ] Update to .NET 6 +- [x] Update to .NET 6 +- [x] Update to Duende IdentityServer v6 ### 2.0.0 - [ ] Connect Admin Api to the Admin UI ([#478](https://github.com/skoruba/IdentityServer4.Admin/issues/478)) diff --git a/build/add-migrations.ps1 b/build/add-migrations.ps1 index c309ac2c7..5e333fc32 100644 --- a/build/add-migrations.ps1 +++ b/build/add-migrations.ps1 @@ -1,5 +1,4 @@ -param([string] $migration = 'DbInit', [string] $migrationProviderName = 'All', [string] $targetContext = 'All') -$projectName = "Skoruba.Duende.IdentityServer"; +param([string] $migration = 'DbInit', [string] $migrationProviderName = 'All', [string] $targetContext = 'All', [string] $projectName = 'Skoruba.Duende.IdentityServer') $currentPath = Get-Location Set-Location "../src/$projectName.Admin" Copy-Item appsettings.json -Destination appsettings-backup.json diff --git a/build/publish-docker-images.ps1 b/build/publish-docker-images.ps1 index a8b84620a..416896904 100644 --- a/build/publish-docker-images.ps1 +++ b/build/publish-docker-images.ps1 @@ -3,7 +3,7 @@ param([string] $version) Set-Location "../" # build docker images according to docker-compose -docker-compose build +docker-compose -f docker-compose.yml build # rename images with following tag docker tag skoruba-duende-identityserver-admin skoruba/duende-identityserver-admin:$version diff --git a/docker-compose.vs.debug.yml b/docker-compose.vs.debug.yml index 92d1a4d4f..4bf6df5e8 100644 --- a/docker-compose.vs.debug.yml +++ b/docker-compose.vs.debug.yml @@ -5,7 +5,7 @@ services: volumes: - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro labels: - com.microsoft.visualstudio.debuggee.arguments: ' --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages "bin/Debug/net5.0/Skoruba.Duende.IdentityServer.Admin.dll" /seed' + com.microsoft.visualstudio.debuggee.arguments: ' --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages "bin/Debug/net6.0/Skoruba.Duende.IdentityServer.Admin.dll" /seed' skoruba.duende.identityserver.admin.api: volumes: diff --git a/docker-compose.vs.release.yml b/docker-compose.vs.release.yml index 92d1a4d4f..4bf6df5e8 100644 --- a/docker-compose.vs.release.yml +++ b/docker-compose.vs.release.yml @@ -5,7 +5,7 @@ services: volumes: - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro labels: - com.microsoft.visualstudio.debuggee.arguments: ' --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages "bin/Debug/net5.0/Skoruba.Duende.IdentityServer.Admin.dll" /seed' + com.microsoft.visualstudio.debuggee.arguments: ' --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages "bin/Debug/net6.0/Skoruba.Duende.IdentityServer.Admin.dll" /seed' skoruba.duende.identityserver.admin.api: volumes: diff --git a/src/Skoruba.Duende.IdentityServer.Admin.Api/Dockerfile b/src/Skoruba.Duende.IdentityServer.Admin.Api/Dockerfile index ef7b0b35c..f64a81703 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.Api/Dockerfile +++ b/src/Skoruba.Duende.IdentityServer.Admin.Api/Dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["src/Skoruba.Duende.IdentityServer.Admin.Api/Skoruba.Duende.IdentityServer.Admin.Api.csproj", "src/Skoruba.Duende.IdentityServer.Admin.Api/"] COPY ["src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.csproj", "src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/"] diff --git a/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Clients/ClientApiDto.cs b/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Clients/ClientApiDto.cs index 9d139bcd8..3a31c5a1a 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Clients/ClientApiDto.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Clients/ClientApiDto.cs @@ -100,6 +100,10 @@ public ClientApiDto() public bool RequireRequestObject { get; set; } + public int? CibaLifetime { get; set; } + public int? PollingInterval { get; set; } + + public List AllowedIdentityTokenSigningAlgorithms { get; set; } public bool NonEditable { get; set; } diff --git a/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Key/KeyApiDto.cs b/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Key/KeyApiDto.cs index d4f11342e..bbc7419e8 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Key/KeyApiDto.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.Api/Dtos/Key/KeyApiDto.cs @@ -13,7 +13,5 @@ public class KeyApiDto public string Use { get; set; } public string Algorithm { get; set; } public bool IsX509Certificate { get; set; } - public bool DataProtected { get; set; } - public string Data { get; set; } } } \ No newline at end of file diff --git a/src/Skoruba.Duende.IdentityServer.Admin.Api/Program.cs b/src/Skoruba.Duende.IdentityServer.Admin.Api/Program.cs index b6dbba8ea..f62df4099 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.Api/Program.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.Api/Program.cs @@ -50,7 +50,7 @@ private static IConfiguration GetConfiguration(string[] args) if (isDevelopment) { - configurationBuilder.AddUserSecrets(); + configurationBuilder.AddUserSecrets(true); } var configuration = configurationBuilder.Build(); @@ -77,7 +77,7 @@ public static IHostBuilder CreateHostBuilder(string[] args) => if (env.IsDevelopment()) { - configApp.AddUserSecrets(); + configApp.AddUserSecrets(true); } configurationRoot.AddAzureKeyVaultConfiguration(configApp); diff --git a/src/Skoruba.Duende.IdentityServer.Admin.Api/Skoruba.Duende.IdentityServer.Admin.Api.csproj b/src/Skoruba.Duende.IdentityServer.Admin.Api/Skoruba.Duende.IdentityServer.Admin.Api.csproj index 42e9018c8..39aab279e 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.Api/Skoruba.Duende.IdentityServer.Admin.Api.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.Api/Skoruba.Duende.IdentityServer.Admin.Api.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 InProcess 1cc472a2-4e4b-48ce-846b-5219f71fc643 ..\..\docker-compose.dcproj @@ -10,47 +10,43 @@ - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + - - diff --git a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity.csproj b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity.csproj index aa49989c4..4c5ba32da 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Identity.csproj @@ -1,19 +1,18 @@  - net5.0 + net6.0 Business Logic layer for the administration of the Asp.Net Core Identity and Duende IdentityServer - - + + - diff --git a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared.csproj b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared.csproj index db55ae2d0..ddc63ab8c 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.Shared.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Shared Business Logic layer for the administration of the Duende IdentityServer and Asp.Net Core Identity diff --git a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Configuration/ClientDto.cs b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Configuration/ClientDto.cs index 5a7d59c9e..0231f9225 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Configuration/ClientDto.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Configuration/ClientDto.cs @@ -111,6 +111,9 @@ public ClientDto() public string UserCodeType { get; set; } public int DeviceCodeLifetime { get; set; } = 300; + public int? CibaLifetime { get; set; } + public int? PollingInterval { get; set; } + public bool NonEditable { get; set; } public bool RequireRequestObject { get; set; } diff --git a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Key/KeyDto.cs b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Key/KeyDto.cs index 275dd2d94..43ba1ed80 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Key/KeyDto.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Dtos/Key/KeyDto.cs @@ -13,7 +13,5 @@ public class KeyDto public string Use { get; set; } public string Algorithm { get; set; } public bool IsX509Certificate { get; set; } - public bool DataProtected { get; set; } - public string Data { get; set; } } } \ No newline at end of file diff --git a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.csproj b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.csproj index d8d618954..67a0ef53c 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.BusinessLogic/Skoruba.Duende.IdentityServer.Admin.BusinessLogic.csproj @@ -1,12 +1,12 @@  - net5.0 + net6.0 Business Logic layer for the administration of the Duende IdentityServer - + diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/PostgreSQL/DatabaseExtensions.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/PostgreSQL/DatabaseExtensions.cs index 4e4ce8fad..ef64f8550 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/PostgreSQL/DatabaseExtensions.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/PostgreSQL/DatabaseExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) Jan Škoruba. All Rights Reserved. // Licensed under the Apache License, Version 2.0. +using System; using System.Reflection; using Duende.IdentityServer.EntityFramework.Storage; using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; @@ -24,6 +25,7 @@ public static class DatabaseExtensions /// /// /// + /// /// /// /// @@ -41,6 +43,8 @@ public static class DatabaseExtensions { var migrationsAssembly = typeof(DatabaseExtensions).GetTypeInfo().Assembly.GetName().Name; + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + // Config DB for identity services.AddDbContext(options => options.UseNpgsql(connectionStrings.IdentityDbConnection, sql => sql.MigrationsAssembly(databaseMigrations.IdentityDbMigrationsAssembly ?? migrationsAssembly))); @@ -91,6 +95,8 @@ public static class DatabaseExtensions { var migrationsAssembly = typeof(DatabaseExtensions).GetTypeInfo().Assembly.GetName().Name; + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + // Config DB for identity services.AddDbContext(options => options.UseNpgsql(identityConnectionString, sql => sql.MigrationsAssembly(migrationsAssembly))); diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration.csproj index 2ab0731c6..1f5ffc9b3 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration.csproj @@ -1,22 +1,21 @@  - net5.0 + net6.0 Entity Framework configuration for the administration of the Duende IdentityServer and Asp.Net Core Identity - + + + - + - - - diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions.csproj index 4bfaf391d..44555ddb7 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Extensions.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 EntityFramework extensions for the administration of the Duende IdentityServer and Asp.Net Core Identity diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity.csproj index 3ce447a6c..1934e6164 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Identity.csproj @@ -1,13 +1,13 @@  - net5.0 + net6.0 Entity Framework layer for the administration of the Asp.Net Core Identity and Duende IdentityServer - - + + diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/20220125140746_UpdateToIS62.Designer.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/20220125140746_UpdateToIS62.Designer.cs new file mode 100644 index 000000000..11a17f73e --- /dev/null +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/20220125140746_UpdateToIS62.Designer.cs @@ -0,0 +1,1046 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts; + +#nullable disable + +namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.Migrations.IdentityServerConfiguration +{ + [DbContext(typeof(IdentityServerConfigurationDbContext))] + [Migration("20220125140746_UpdateToIS62")] + partial class UpdateToIS62 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + + b.Property("RequireResourceIndicator") + .HasColumnType("tinyint(1)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("tinyint(1)"); + + b.Property("Updated") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ApiResources", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Type") + .IsUnique(); + + b.ToTable("ApiResourceClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Key") + .IsUnique(); + + b.ToTable("ApiResourceProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Scope") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Scope") + .IsUnique(); + + b.ToTable("ApiResourceScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("varchar(4000)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId"); + + b.ToTable("ApiResourceSecrets", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Emphasize") + .HasColumnType("tinyint(1)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + + b.Property("Required") + .HasColumnType("tinyint(1)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("tinyint(1)"); + + b.Property("Updated") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ApiScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ScopeId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ScopeId", "Type") + .IsUnique(); + + b.ToTable("ApiScopeClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("ScopeId") + .HasColumnType("int"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ScopeId", "Key") + .IsUnique(); + + b.ToTable("ApiScopeProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AbsoluteRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenType") + .HasColumnType("int"); + + b.Property("AllowAccessTokensViaBrowser") + .HasColumnType("tinyint(1)"); + + b.Property("AllowOfflineAccess") + .HasColumnType("tinyint(1)"); + + b.Property("AllowPlainTextPkce") + .HasColumnType("tinyint(1)"); + + b.Property("AllowRememberConsent") + .HasColumnType("tinyint(1)"); + + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("AlwaysIncludeUserClaimsInIdToken") + .HasColumnType("tinyint(1)"); + + b.Property("AlwaysSendClientClaims") + .HasColumnType("tinyint(1)"); + + b.Property("AuthorizationCodeLifetime") + .HasColumnType("int"); + + b.Property("BackChannelLogoutSessionRequired") + .HasColumnType("tinyint(1)"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("CibaLifetime") + .HasColumnType("int"); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("ConsentLifetime") + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DeviceCodeLifetime") + .HasColumnType("int"); + + b.Property("EnableLocalLogin") + .HasColumnType("tinyint(1)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("FrontChannelLogoutSessionRequired") + .HasColumnType("tinyint(1)"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("IdentityTokenLifetime") + .HasColumnType("int"); + + b.Property("IncludeJwtId") + .HasColumnType("tinyint(1)"); + + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + + b.Property("LogoUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("PollingInterval") + .HasColumnType("int"); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("RefreshTokenExpiration") + .HasColumnType("int"); + + b.Property("RefreshTokenUsage") + .HasColumnType("int"); + + b.Property("RequireClientSecret") + .HasColumnType("tinyint(1)"); + + b.Property("RequireConsent") + .HasColumnType("tinyint(1)"); + + b.Property("RequirePkce") + .HasColumnType("tinyint(1)"); + + b.Property("RequireRequestObject") + .HasColumnType("tinyint(1)"); + + b.Property("SlidingRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("UpdateAccessTokenClaimsOnRefresh") + .HasColumnType("tinyint(1)"); + + b.Property("Updated") + .HasColumnType("datetime(6)"); + + b.Property("UserCodeType") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("UserSsoLifetime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique(); + + b.ToTable("Clients", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Type", "Value") + .IsUnique(); + + b.ToTable("ClientClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Origin") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("varchar(150)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Origin") + .IsUnique(); + + b.ToTable("ClientCorsOrigins", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("GrantType") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "GrantType") + .IsUnique(); + + b.ToTable("ClientGrantTypes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Provider") + .IsUnique(); + + b.ToTable("ClientIdPRestrictions", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("PostLogoutRedirectUri") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "PostLogoutRedirectUri") + .IsUnique(); + + b.ToTable("ClientPostLogoutRedirectUris", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Key") + .IsUnique(); + + b.ToTable("ClientProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("RedirectUri") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "RedirectUri") + .IsUnique(); + + b.ToTable("ClientRedirectUris", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Scope") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Scope") + .IsUnique(); + + b.ToTable("ClientScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("varchar(4000)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("ClientSecrets", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityProvider", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("Scheme") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("varchar(20)"); + + b.Property("Updated") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("Scheme") + .IsUnique(); + + b.ToTable("IdentityProviders", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Emphasize") + .HasColumnType("tinyint(1)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + + b.Property("Required") + .HasColumnType("tinyint(1)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("tinyint(1)"); + + b.Property("Updated") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("IdentityResources", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("IdentityResourceId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("IdentityResourceId", "Type") + .IsUnique(); + + b.ToTable("IdentityResourceClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("IdentityResourceId") + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("IdentityResourceId", "Key") + .IsUnique(); + + b.ToTable("IdentityResourceProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiScope", "Scope") + .WithMany("UserClaims") + .HasForeignKey("ScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scope"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiScope", "Scope") + .WithMany("Properties") + .HasForeignKey("ScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scope"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", "IdentityResource") + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IdentityResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", "IdentityResource") + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IdentityResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/20220125140746_UpdateToIS62.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/20220125140746_UpdateToIS62.cs new file mode 100644 index 000000000..98120c3ac --- /dev/null +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/20220125140746_UpdateToIS62.cs @@ -0,0 +1,463 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.Migrations.IdentityServerConfiguration +{ + public partial class UpdateToIS62 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId", + table: "IdentityResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId", + table: "IdentityResourceClaims"); + + migrationBuilder.DropIndex( + name: "IX_ClientScopes_ClientId", + table: "ClientScopes"); + + migrationBuilder.DropIndex( + name: "IX_ClientRedirectUris_ClientId", + table: "ClientRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientProperties_ClientId", + table: "ClientProperties"); + + migrationBuilder.DropIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId", + table: "ClientPostLogoutRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientIdPRestrictions_ClientId", + table: "ClientIdPRestrictions"); + + migrationBuilder.DropIndex( + name: "IX_ClientGrantTypes_ClientId", + table: "ClientGrantTypes"); + + migrationBuilder.DropIndex( + name: "IX_ClientCorsOrigins_ClientId", + table: "ClientCorsOrigins"); + + migrationBuilder.DropIndex( + name: "IX_ClientClaims_ClientId", + table: "ClientClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeProperties_ScopeId", + table: "ApiScopeProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeClaims_ScopeId", + table: "ApiScopeClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceScopes_ApiResourceId", + table: "ApiResourceScopes"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceProperties_ApiResourceId", + table: "ApiResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceClaims_ApiResourceId", + table: "ApiResourceClaims"); + + migrationBuilder.AddColumn( + name: "Created", + table: "IdentityProviders", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "LastAccessed", + table: "IdentityProviders", + type: "datetime(6)", + nullable: true); + + migrationBuilder.AddColumn( + name: "NonEditable", + table: "IdentityProviders", + type: "tinyint(1)", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Updated", + table: "IdentityProviders", + type: "datetime(6)", + nullable: true); + + migrationBuilder.AddColumn( + name: "CibaLifetime", + table: "Clients", + type: "int", + nullable: true); + + migrationBuilder.AddColumn( + name: "PollingInterval", + table: "Clients", + type: "int", + nullable: true); + + migrationBuilder.AlterColumn( + name: "RedirectUri", + table: "ClientRedirectUris", + type: "varchar(400)", + maxLength: 400, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(2000)", + oldMaxLength: 2000) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + type: "varchar(400)", + maxLength: 400, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(2000)", + oldMaxLength: 2000) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "Created", + table: "ApiScopes", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "LastAccessed", + table: "ApiScopes", + type: "datetime(6)", + nullable: true); + + migrationBuilder.AddColumn( + name: "NonEditable", + table: "ApiScopes", + type: "tinyint(1)", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Updated", + table: "ApiScopes", + type: "datetime(6)", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId_Key", + table: "IdentityResourceProperties", + columns: new[] { "IdentityResourceId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId_Type", + table: "IdentityResourceClaims", + columns: new[] { "IdentityResourceId", "Type" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityProviders_Scheme", + table: "IdentityProviders", + column: "Scheme", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientScopes_ClientId_Scope", + table: "ClientScopes", + columns: new[] { "ClientId", "Scope" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientRedirectUris_ClientId_RedirectUri", + table: "ClientRedirectUris", + columns: new[] { "ClientId", "RedirectUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientProperties_ClientId_Key", + table: "ClientProperties", + columns: new[] { "ClientId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId_PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + columns: new[] { "ClientId", "PostLogoutRedirectUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientIdPRestrictions_ClientId_Provider", + table: "ClientIdPRestrictions", + columns: new[] { "ClientId", "Provider" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientGrantTypes_ClientId_GrantType", + table: "ClientGrantTypes", + columns: new[] { "ClientId", "GrantType" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientCorsOrigins_ClientId_Origin", + table: "ClientCorsOrigins", + columns: new[] { "ClientId", "Origin" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientClaims_ClientId_Type_Value", + table: "ClientClaims", + columns: new[] { "ClientId", "Type", "Value" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeProperties_ScopeId_Key", + table: "ApiScopeProperties", + columns: new[] { "ScopeId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeClaims_ScopeId_Type", + table: "ApiScopeClaims", + columns: new[] { "ScopeId", "Type" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceScopes_ApiResourceId_Scope", + table: "ApiResourceScopes", + columns: new[] { "ApiResourceId", "Scope" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceProperties_ApiResourceId_Key", + table: "ApiResourceProperties", + columns: new[] { "ApiResourceId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceClaims_ApiResourceId_Type", + table: "ApiResourceClaims", + columns: new[] { "ApiResourceId", "Type" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId_Key", + table: "IdentityResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId_Type", + table: "IdentityResourceClaims"); + + migrationBuilder.DropIndex( + name: "IX_IdentityProviders_Scheme", + table: "IdentityProviders"); + + migrationBuilder.DropIndex( + name: "IX_ClientScopes_ClientId_Scope", + table: "ClientScopes"); + + migrationBuilder.DropIndex( + name: "IX_ClientRedirectUris_ClientId_RedirectUri", + table: "ClientRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientProperties_ClientId_Key", + table: "ClientProperties"); + + migrationBuilder.DropIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId_PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientIdPRestrictions_ClientId_Provider", + table: "ClientIdPRestrictions"); + + migrationBuilder.DropIndex( + name: "IX_ClientGrantTypes_ClientId_GrantType", + table: "ClientGrantTypes"); + + migrationBuilder.DropIndex( + name: "IX_ClientCorsOrigins_ClientId_Origin", + table: "ClientCorsOrigins"); + + migrationBuilder.DropIndex( + name: "IX_ClientClaims_ClientId_Type_Value", + table: "ClientClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeProperties_ScopeId_Key", + table: "ApiScopeProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeClaims_ScopeId_Type", + table: "ApiScopeClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceScopes_ApiResourceId_Scope", + table: "ApiResourceScopes"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceProperties_ApiResourceId_Key", + table: "ApiResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceClaims_ApiResourceId_Type", + table: "ApiResourceClaims"); + + migrationBuilder.DropColumn( + name: "Created", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "LastAccessed", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "NonEditable", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "Updated", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "CibaLifetime", + table: "Clients"); + + migrationBuilder.DropColumn( + name: "PollingInterval", + table: "Clients"); + + migrationBuilder.DropColumn( + name: "Created", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "LastAccessed", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "NonEditable", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "Updated", + table: "ApiScopes"); + + migrationBuilder.AlterColumn( + name: "RedirectUri", + table: "ClientRedirectUris", + type: "varchar(2000)", + maxLength: 2000, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(400)", + oldMaxLength: 400) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + type: "varchar(2000)", + maxLength: 2000, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(400)", + oldMaxLength: 400) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId", + table: "IdentityResourceProperties", + column: "IdentityResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId", + table: "IdentityResourceClaims", + column: "IdentityResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientScopes_ClientId", + table: "ClientScopes", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientRedirectUris_ClientId", + table: "ClientRedirectUris", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientProperties_ClientId", + table: "ClientProperties", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId", + table: "ClientPostLogoutRedirectUris", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientIdPRestrictions_ClientId", + table: "ClientIdPRestrictions", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientGrantTypes_ClientId", + table: "ClientGrantTypes", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientCorsOrigins_ClientId", + table: "ClientCorsOrigins", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientClaims_ClientId", + table: "ClientClaims", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeProperties_ScopeId", + table: "ApiScopeProperties", + column: "ScopeId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeClaims_ScopeId", + table: "ApiScopeClaims", + column: "ScopeId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceScopes_ApiResourceId", + table: "ApiResourceScopes", + column: "ApiResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceProperties_ApiResourceId", + table: "ApiResourceProperties", + column: "ApiResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceClaims_ApiResourceId", + table: "ApiResourceClaims", + column: "ApiResourceId"); + } + } +} diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs index 8d0dcb8c5..fc27a3da9 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs @@ -5,6 +5,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts; +#nullable disable + namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.Migrations.IdentityServerConfiguration { [DbContext(typeof(IdentityServerConfigurationDbContext))] @@ -14,8 +16,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 64) - .HasAnnotation("ProductVersion", "5.0.12"); + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 64); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => { @@ -66,7 +68,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Name") .IsUnique(); - b.ToTable("ApiResources"); + b.ToTable("ApiResources", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => @@ -85,9 +87,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Type") + .IsUnique(); - b.ToTable("ApiResourceClaims"); + b.ToTable("ApiResourceClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => @@ -111,9 +114,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Key") + .IsUnique(); - b.ToTable("ApiResourceProperties"); + b.ToTable("ApiResourceProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => @@ -132,9 +136,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Scope") + .IsUnique(); - b.ToTable("ApiResourceScopes"); + b.ToTable("ApiResourceScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => @@ -170,7 +175,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ApiResourceId"); - b.ToTable("ApiResourceSecrets"); + b.ToTable("ApiResourceSecrets", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => @@ -179,6 +184,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasColumnType("int"); + b.Property("Created") + .HasColumnType("datetime(6)"); + b.Property("Description") .HasMaxLength(1000) .HasColumnType("varchar(1000)"); @@ -193,23 +201,32 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Enabled") .HasColumnType("tinyint(1)"); + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("varchar(200)"); + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + b.Property("Required") .HasColumnType("tinyint(1)"); b.Property("ShowInDiscoveryDocument") .HasColumnType("tinyint(1)"); + b.Property("Updated") + .HasColumnType("datetime(6)"); + b.HasKey("Id"); b.HasIndex("Name") .IsUnique(); - b.ToTable("ApiScopes"); + b.ToTable("ApiScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => @@ -228,9 +245,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ScopeId"); + b.HasIndex("ScopeId", "Type") + .IsUnique(); - b.ToTable("ApiScopeClaims"); + b.ToTable("ApiScopeClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => @@ -254,9 +272,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ScopeId"); + b.HasIndex("ScopeId", "Key") + .IsUnique(); - b.ToTable("ApiScopeProperties"); + b.ToTable("ApiScopeProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => @@ -306,6 +325,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(2000) .HasColumnType("varchar(2000)"); + b.Property("CibaLifetime") + .HasColumnType("int"); + b.Property("ClientClaimsPrefix") .HasMaxLength(200) .HasColumnType("varchar(200)"); @@ -369,6 +391,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(200) .HasColumnType("varchar(200)"); + b.Property("PollingInterval") + .HasColumnType("int"); + b.Property("ProtocolType") .IsRequired() .HasMaxLength(200) @@ -413,7 +438,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientId") .IsUnique(); - b.ToTable("Clients"); + b.ToTable("Clients", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => @@ -437,9 +462,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Type", "Value") + .IsUnique(); - b.ToTable("ClientClaims"); + b.ToTable("ClientClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => @@ -458,9 +484,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Origin") + .IsUnique(); - b.ToTable("ClientCorsOrigins"); + b.ToTable("ClientCorsOrigins", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => @@ -479,9 +506,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "GrantType") + .IsUnique(); - b.ToTable("ClientGrantTypes"); + b.ToTable("ClientGrantTypes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => @@ -500,9 +528,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Provider") + .IsUnique(); - b.ToTable("ClientIdPRestrictions"); + b.ToTable("ClientIdPRestrictions", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => @@ -516,14 +545,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("PostLogoutRedirectUri") .IsRequired() - .HasMaxLength(2000) - .HasColumnType("varchar(2000)"); + .HasMaxLength(400) + .HasColumnType("varchar(400)"); b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "PostLogoutRedirectUri") + .IsUnique(); - b.ToTable("ClientPostLogoutRedirectUris"); + b.ToTable("ClientPostLogoutRedirectUris", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => @@ -547,9 +577,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Key") + .IsUnique(); - b.ToTable("ClientProperties"); + b.ToTable("ClientProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => @@ -563,14 +594,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("RedirectUri") .IsRequired() - .HasMaxLength(2000) - .HasColumnType("varchar(2000)"); + .HasMaxLength(400) + .HasColumnType("varchar(400)"); b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "RedirectUri") + .IsUnique(); - b.ToTable("ClientRedirectUris"); + b.ToTable("ClientRedirectUris", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => @@ -589,9 +621,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Scope") + .IsUnique(); - b.ToTable("ClientScopes"); + b.ToTable("ClientScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => @@ -627,7 +660,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientId"); - b.ToTable("ClientSecrets"); + b.ToTable("ClientSecrets", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityProvider", b => @@ -636,6 +669,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasColumnType("int"); + b.Property("Created") + .HasColumnType("datetime(6)"); + b.Property("DisplayName") .HasMaxLength(200) .HasColumnType("varchar(200)"); @@ -643,6 +679,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Enabled") .HasColumnType("tinyint(1)"); + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + + b.Property("NonEditable") + .HasColumnType("tinyint(1)"); + b.Property("Properties") .HasColumnType("longtext"); @@ -656,9 +698,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(20) .HasColumnType("varchar(20)"); + b.Property("Updated") + .HasColumnType("datetime(6)"); + b.HasKey("Id"); - b.ToTable("IdentityProviders"); + b.HasIndex("Scheme") + .IsUnique(); + + b.ToTable("IdentityProviders", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => @@ -706,7 +754,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Name") .IsUnique(); - b.ToTable("IdentityResources"); + b.ToTable("IdentityResources", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => @@ -725,9 +773,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("IdentityResourceId"); + b.HasIndex("IdentityResourceId", "Type") + .IsUnique(); - b.ToTable("IdentityResourceClaims"); + b.ToTable("IdentityResourceClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => @@ -751,9 +800,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("IdentityResourceId"); + b.HasIndex("IdentityResourceId", "Key") + .IsUnique(); - b.ToTable("IdentityResourceProperties"); + b.ToTable("IdentityResourceProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.csproj index f812fd83c..acef0c3d9 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql/Skoruba.Duende.IdentityServer.Admin.EntityFramework.MySql.csproj @@ -1,20 +1,17 @@  - net5.0 + net6.0 Entity Framework layer for the administration of the Duende IdentityServer and Asp.Net Core Identity with MySql support - - + - - diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/20220125145446_UpdateToIS6.Designer.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/20220125145446_UpdateToIS6.Designer.cs new file mode 100644 index 000000000..3d5687fd1 --- /dev/null +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/20220125145446_UpdateToIS6.Designer.cs @@ -0,0 +1,1093 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts; + +#nullable disable + +namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.Migrations.IdentityServerConfiguration +{ + [DbContext(typeof(IdentityServerConfigurationDbContext))] + [Migration("20220125145446_UpdateToIS6")] + partial class UpdateToIS6 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("NonEditable") + .HasColumnType("boolean"); + + b.Property("RequireResourceIndicator") + .HasColumnType("boolean"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("boolean"); + + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ApiResources", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiResourceId") + .HasColumnType("integer"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Type") + .IsUnique(); + + b.ToTable("ApiResourceClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiResourceId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Key") + .IsUnique(); + + b.ToTable("ApiResourceProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiResourceId") + .HasColumnType("integer"); + + b.Property("Scope") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Scope") + .IsUnique(); + + b.ToTable("ApiResourceScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiResourceId") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("Expiration") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("character varying(4000)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId"); + + b.ToTable("ApiResourceSecrets", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Emphasize") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("NonEditable") + .HasColumnType("boolean"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("boolean"); + + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ApiScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ScopeId") + .HasColumnType("integer"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("ScopeId", "Type") + .IsUnique(); + + b.ToTable("ApiScopeClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("ScopeId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ScopeId", "Key") + .IsUnique(); + + b.ToTable("ApiScopeProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AbsoluteRefreshTokenLifetime") + .HasColumnType("integer"); + + b.Property("AccessTokenLifetime") + .HasColumnType("integer"); + + b.Property("AccessTokenType") + .HasColumnType("integer"); + + b.Property("AllowAccessTokensViaBrowser") + .HasColumnType("boolean"); + + b.Property("AllowOfflineAccess") + .HasColumnType("boolean"); + + b.Property("AllowPlainTextPkce") + .HasColumnType("boolean"); + + b.Property("AllowRememberConsent") + .HasColumnType("boolean"); + + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("AlwaysIncludeUserClaimsInIdToken") + .HasColumnType("boolean"); + + b.Property("AlwaysSendClientClaims") + .HasColumnType("boolean"); + + b.Property("AuthorizationCodeLifetime") + .HasColumnType("integer"); + + b.Property("BackChannelLogoutSessionRequired") + .HasColumnType("boolean"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("CibaLifetime") + .HasColumnType("integer"); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ConsentLifetime") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DeviceCodeLifetime") + .HasColumnType("integer"); + + b.Property("EnableLocalLogin") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("FrontChannelLogoutSessionRequired") + .HasColumnType("boolean"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("IdentityTokenLifetime") + .HasColumnType("integer"); + + b.Property("IncludeJwtId") + .HasColumnType("boolean"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("LogoUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("NonEditable") + .HasColumnType("boolean"); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PollingInterval") + .HasColumnType("integer"); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RefreshTokenExpiration") + .HasColumnType("integer"); + + b.Property("RefreshTokenUsage") + .HasColumnType("integer"); + + b.Property("RequireClientSecret") + .HasColumnType("boolean"); + + b.Property("RequireConsent") + .HasColumnType("boolean"); + + b.Property("RequirePkce") + .HasColumnType("boolean"); + + b.Property("RequireRequestObject") + .HasColumnType("boolean"); + + b.Property("SlidingRefreshTokenLifetime") + .HasColumnType("integer"); + + b.Property("UpdateAccessTokenClaimsOnRefresh") + .HasColumnType("boolean"); + + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + + b.Property("UserCodeType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("UserSsoLifetime") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique(); + + b.ToTable("Clients", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Type", "Value") + .IsUnique(); + + b.ToTable("ClientClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("Origin") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Origin") + .IsUnique(); + + b.ToTable("ClientCorsOrigins", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("GrantType") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "GrantType") + .IsUnique(); + + b.ToTable("ClientGrantTypes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Provider") + .IsUnique(); + + b.ToTable("ClientIdPRestrictions", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("PostLogoutRedirectUri") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "PostLogoutRedirectUri") + .IsUnique(); + + b.ToTable("ClientPostLogoutRedirectUris", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Key") + .IsUnique(); + + b.ToTable("ClientProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("RedirectUri") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "RedirectUri") + .IsUnique(); + + b.ToTable("ClientRedirectUris", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("Scope") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Scope") + .IsUnique(); + + b.ToTable("ClientScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("Expiration") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("character varying(4000)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("ClientSecrets", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityProvider", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("NonEditable") + .HasColumnType("boolean"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scheme") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("Scheme") + .IsUnique(); + + b.ToTable("IdentityProviders", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Emphasize") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("NonEditable") + .HasColumnType("boolean"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("boolean"); + + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("IdentityResources", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityResourceId") + .HasColumnType("integer"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("IdentityResourceId", "Type") + .IsUnique(); + + b.ToTable("IdentityResourceClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityResourceId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("IdentityResourceId", "Key") + .IsUnique(); + + b.ToTable("IdentityResourceProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiScope", "Scope") + .WithMany("UserClaims") + .HasForeignKey("ScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scope"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiScope", "Scope") + .WithMany("Properties") + .HasForeignKey("ScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scope"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", "IdentityResource") + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IdentityResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", "IdentityResource") + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IdentityResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/20220125145446_UpdateToIS6.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/20220125145446_UpdateToIS6.cs new file mode 100644 index 000000000..9c44d98bb --- /dev/null +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/20220125145446_UpdateToIS6.cs @@ -0,0 +1,455 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.Migrations.IdentityServerConfiguration +{ + public partial class UpdateToIS6 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId", + table: "IdentityResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId", + table: "IdentityResourceClaims"); + + migrationBuilder.DropIndex( + name: "IX_ClientScopes_ClientId", + table: "ClientScopes"); + + migrationBuilder.DropIndex( + name: "IX_ClientRedirectUris_ClientId", + table: "ClientRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientProperties_ClientId", + table: "ClientProperties"); + + migrationBuilder.DropIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId", + table: "ClientPostLogoutRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientIdPRestrictions_ClientId", + table: "ClientIdPRestrictions"); + + migrationBuilder.DropIndex( + name: "IX_ClientGrantTypes_ClientId", + table: "ClientGrantTypes"); + + migrationBuilder.DropIndex( + name: "IX_ClientCorsOrigins_ClientId", + table: "ClientCorsOrigins"); + + migrationBuilder.DropIndex( + name: "IX_ClientClaims_ClientId", + table: "ClientClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeProperties_ScopeId", + table: "ApiScopeProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeClaims_ScopeId", + table: "ApiScopeClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceScopes_ApiResourceId", + table: "ApiResourceScopes"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceProperties_ApiResourceId", + table: "ApiResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceClaims_ApiResourceId", + table: "ApiResourceClaims"); + + migrationBuilder.AddColumn( + name: "Created", + table: "IdentityProviders", + type: "timestamp without time zone", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "LastAccessed", + table: "IdentityProviders", + type: "timestamp without time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "NonEditable", + table: "IdentityProviders", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Updated", + table: "IdentityProviders", + type: "timestamp without time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "CibaLifetime", + table: "Clients", + type: "integer", + nullable: true); + + migrationBuilder.AddColumn( + name: "PollingInterval", + table: "Clients", + type: "integer", + nullable: true); + + migrationBuilder.AlterColumn( + name: "RedirectUri", + table: "ClientRedirectUris", + type: "character varying(400)", + maxLength: 400, + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(2000)", + oldMaxLength: 2000); + + migrationBuilder.AlterColumn( + name: "PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + type: "character varying(400)", + maxLength: 400, + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(2000)", + oldMaxLength: 2000); + + migrationBuilder.AddColumn( + name: "Created", + table: "ApiScopes", + type: "timestamp without time zone", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "LastAccessed", + table: "ApiScopes", + type: "timestamp without time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "NonEditable", + table: "ApiScopes", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Updated", + table: "ApiScopes", + type: "timestamp without time zone", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId_Key", + table: "IdentityResourceProperties", + columns: new[] { "IdentityResourceId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId_Type", + table: "IdentityResourceClaims", + columns: new[] { "IdentityResourceId", "Type" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityProviders_Scheme", + table: "IdentityProviders", + column: "Scheme", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientScopes_ClientId_Scope", + table: "ClientScopes", + columns: new[] { "ClientId", "Scope" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientRedirectUris_ClientId_RedirectUri", + table: "ClientRedirectUris", + columns: new[] { "ClientId", "RedirectUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientProperties_ClientId_Key", + table: "ClientProperties", + columns: new[] { "ClientId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId_PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + columns: new[] { "ClientId", "PostLogoutRedirectUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientIdPRestrictions_ClientId_Provider", + table: "ClientIdPRestrictions", + columns: new[] { "ClientId", "Provider" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientGrantTypes_ClientId_GrantType", + table: "ClientGrantTypes", + columns: new[] { "ClientId", "GrantType" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientCorsOrigins_ClientId_Origin", + table: "ClientCorsOrigins", + columns: new[] { "ClientId", "Origin" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientClaims_ClientId_Type_Value", + table: "ClientClaims", + columns: new[] { "ClientId", "Type", "Value" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeProperties_ScopeId_Key", + table: "ApiScopeProperties", + columns: new[] { "ScopeId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeClaims_ScopeId_Type", + table: "ApiScopeClaims", + columns: new[] { "ScopeId", "Type" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceScopes_ApiResourceId_Scope", + table: "ApiResourceScopes", + columns: new[] { "ApiResourceId", "Scope" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceProperties_ApiResourceId_Key", + table: "ApiResourceProperties", + columns: new[] { "ApiResourceId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceClaims_ApiResourceId_Type", + table: "ApiResourceClaims", + columns: new[] { "ApiResourceId", "Type" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId_Key", + table: "IdentityResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId_Type", + table: "IdentityResourceClaims"); + + migrationBuilder.DropIndex( + name: "IX_IdentityProviders_Scheme", + table: "IdentityProviders"); + + migrationBuilder.DropIndex( + name: "IX_ClientScopes_ClientId_Scope", + table: "ClientScopes"); + + migrationBuilder.DropIndex( + name: "IX_ClientRedirectUris_ClientId_RedirectUri", + table: "ClientRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientProperties_ClientId_Key", + table: "ClientProperties"); + + migrationBuilder.DropIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId_PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientIdPRestrictions_ClientId_Provider", + table: "ClientIdPRestrictions"); + + migrationBuilder.DropIndex( + name: "IX_ClientGrantTypes_ClientId_GrantType", + table: "ClientGrantTypes"); + + migrationBuilder.DropIndex( + name: "IX_ClientCorsOrigins_ClientId_Origin", + table: "ClientCorsOrigins"); + + migrationBuilder.DropIndex( + name: "IX_ClientClaims_ClientId_Type_Value", + table: "ClientClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeProperties_ScopeId_Key", + table: "ApiScopeProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeClaims_ScopeId_Type", + table: "ApiScopeClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceScopes_ApiResourceId_Scope", + table: "ApiResourceScopes"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceProperties_ApiResourceId_Key", + table: "ApiResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceClaims_ApiResourceId_Type", + table: "ApiResourceClaims"); + + migrationBuilder.DropColumn( + name: "Created", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "LastAccessed", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "NonEditable", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "Updated", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "CibaLifetime", + table: "Clients"); + + migrationBuilder.DropColumn( + name: "PollingInterval", + table: "Clients"); + + migrationBuilder.DropColumn( + name: "Created", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "LastAccessed", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "NonEditable", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "Updated", + table: "ApiScopes"); + + migrationBuilder.AlterColumn( + name: "RedirectUri", + table: "ClientRedirectUris", + type: "character varying(2000)", + maxLength: 2000, + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(400)", + oldMaxLength: 400); + + migrationBuilder.AlterColumn( + name: "PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + type: "character varying(2000)", + maxLength: 2000, + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(400)", + oldMaxLength: 400); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId", + table: "IdentityResourceProperties", + column: "IdentityResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId", + table: "IdentityResourceClaims", + column: "IdentityResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientScopes_ClientId", + table: "ClientScopes", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientRedirectUris_ClientId", + table: "ClientRedirectUris", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientProperties_ClientId", + table: "ClientProperties", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId", + table: "ClientPostLogoutRedirectUris", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientIdPRestrictions_ClientId", + table: "ClientIdPRestrictions", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientGrantTypes_ClientId", + table: "ClientGrantTypes", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientCorsOrigins_ClientId", + table: "ClientCorsOrigins", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientClaims_ClientId", + table: "ClientClaims", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeProperties_ScopeId", + table: "ApiScopeProperties", + column: "ScopeId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeClaims_ScopeId", + table: "ApiScopeClaims", + column: "ScopeId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceScopes_ApiResourceId", + table: "ApiResourceScopes", + column: "ApiResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceProperties_ApiResourceId", + table: "ApiResourceProperties", + column: "ApiResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceClaims_ApiResourceId", + table: "ApiResourceClaims", + column: "ApiResourceId"); + } + } +} diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs index de86baae6..edc400f4b 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs @@ -6,6 +6,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts; +#nullable disable + namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.Migrations.IdentityServerConfiguration { [DbContext(typeof(IdentityServerConfigurationDbContext))] @@ -15,16 +17,18 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.12") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("AllowedAccessTokenSigningAlgorithms") .HasMaxLength(100) @@ -69,15 +73,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Name") .IsUnique(); - b.ToTable("ApiResources"); + b.ToTable("ApiResources", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ApiResourceId") .HasColumnType("integer"); @@ -89,17 +94,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Type") + .IsUnique(); - b.ToTable("ApiResourceClaims"); + b.ToTable("ApiResourceClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ApiResourceId") .HasColumnType("integer"); @@ -116,17 +123,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Key") + .IsUnique(); - b.ToTable("ApiResourceProperties"); + b.ToTable("ApiResourceProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ApiResourceId") .HasColumnType("integer"); @@ -138,17 +147,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Scope") + .IsUnique(); - b.ToTable("ApiResourceScopes"); + b.ToTable("ApiResourceScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ApiResourceId") .HasColumnType("integer"); @@ -177,15 +188,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ApiResourceId"); - b.ToTable("ApiResourceSecrets"); + b.ToTable("ApiResourceSecrets", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); b.Property("Description") .HasMaxLength(1000) @@ -201,31 +216,41 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Enabled") .HasColumnType("boolean"); + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); + b.Property("NonEditable") + .HasColumnType("boolean"); + b.Property("Required") .HasColumnType("boolean"); b.Property("ShowInDiscoveryDocument") .HasColumnType("boolean"); + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + b.HasKey("Id"); b.HasIndex("Name") .IsUnique(); - b.ToTable("ApiScopes"); + b.ToTable("ApiScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ScopeId") .HasColumnType("integer"); @@ -237,17 +262,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ScopeId"); + b.HasIndex("ScopeId", "Type") + .IsUnique(); - b.ToTable("ApiScopeClaims"); + b.ToTable("ApiScopeClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Key") .IsRequired() @@ -264,17 +291,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ScopeId"); + b.HasIndex("ScopeId", "Key") + .IsUnique(); - b.ToTable("ApiScopeProperties"); + b.ToTable("ApiScopeProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("AbsoluteRefreshTokenLifetime") .HasColumnType("integer"); @@ -317,6 +346,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(2000) .HasColumnType("character varying(2000)"); + b.Property("CibaLifetime") + .HasColumnType("integer"); + b.Property("ClientClaimsPrefix") .HasMaxLength(200) .HasColumnType("character varying(200)"); @@ -380,6 +412,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(200) .HasColumnType("character varying(200)"); + b.Property("PollingInterval") + .HasColumnType("integer"); + b.Property("ProtocolType") .IsRequired() .HasMaxLength(200) @@ -424,15 +459,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientId") .IsUnique(); - b.ToTable("Clients"); + b.ToTable("Clients", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -449,17 +485,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Type", "Value") + .IsUnique(); - b.ToTable("ClientClaims"); + b.ToTable("ClientClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -471,17 +509,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Origin") + .IsUnique(); - b.ToTable("ClientCorsOrigins"); + b.ToTable("ClientCorsOrigins", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -493,17 +533,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "GrantType") + .IsUnique(); - b.ToTable("ClientGrantTypes"); + b.ToTable("ClientGrantTypes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -515,39 +557,43 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Provider") + .IsUnique(); - b.ToTable("ClientIdPRestrictions"); + b.ToTable("ClientIdPRestrictions", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); b.Property("PostLogoutRedirectUri") .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); + .HasMaxLength(400) + .HasColumnType("character varying(400)"); b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "PostLogoutRedirectUri") + .IsUnique(); - b.ToTable("ClientPostLogoutRedirectUris"); + b.ToTable("ClientPostLogoutRedirectUris", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -564,39 +610,43 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Key") + .IsUnique(); - b.ToTable("ClientProperties"); + b.ToTable("ClientProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); b.Property("RedirectUri") .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); + .HasMaxLength(400) + .HasColumnType("character varying(400)"); b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "RedirectUri") + .IsUnique(); - b.ToTable("ClientRedirectUris"); + b.ToTable("ClientRedirectUris", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -608,17 +658,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Scope") + .IsUnique(); - b.ToTable("ClientScopes"); + b.ToTable("ClientScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ClientId") .HasColumnType("integer"); @@ -647,15 +699,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientId"); - b.ToTable("ClientSecrets"); + b.ToTable("ClientSecrets", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityProvider", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp without time zone"); b.Property("DisplayName") .HasMaxLength(200) @@ -664,6 +720,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Enabled") .HasColumnType("boolean"); + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("NonEditable") + .HasColumnType("boolean"); + b.Property("Properties") .HasColumnType("text"); @@ -677,17 +739,24 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(20) .HasColumnType("character varying(20)"); + b.Property("Updated") + .HasColumnType("timestamp without time zone"); + b.HasKey("Id"); - b.ToTable("IdentityProviders"); + b.HasIndex("Scheme") + .IsUnique(); + + b.ToTable("IdentityProviders", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Created") .HasColumnType("timestamp without time zone"); @@ -728,15 +797,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Name") .IsUnique(); - b.ToTable("IdentityResources"); + b.ToTable("IdentityResources", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("IdentityResourceId") .HasColumnType("integer"); @@ -748,17 +818,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("IdentityResourceId"); + b.HasIndex("IdentityResourceId", "Type") + .IsUnique(); - b.ToTable("IdentityResourceClaims"); + b.ToTable("IdentityResourceClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("IdentityResourceId") .HasColumnType("integer"); @@ -775,9 +847,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("IdentityResourceId"); + b.HasIndex("IdentityResourceId", "Key") + .IsUnique(); - b.ToTable("IdentityResourceProperties"); + b.ToTable("IdentityResourceProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.csproj index ef181c49c..5541e3c4a 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL/Skoruba.Duende.IdentityServer.Admin.EntityFramework.PostgreSQL.csproj @@ -1,19 +1,16 @@  - net5.0 + net6.0 Entity Framework layer for the administration of the Duende IdentityServer and Asp.Net Core Identity with PostrgreSQL support - - + - - - + diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerConfigurationDbContext.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerConfigurationDbContext.cs index 8d04697fe..65768cfb4 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerConfigurationDbContext.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerConfigurationDbContext.cs @@ -3,7 +3,6 @@ using Duende.IdentityServer.EntityFramework.DbContexts; using Duende.IdentityServer.EntityFramework.Entities; -using Duende.IdentityServer.EntityFramework.Options; using Microsoft.EntityFrameworkCore; using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Interfaces; @@ -11,8 +10,8 @@ namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts { public class IdentityServerConfigurationDbContext : ConfigurationDbContext, IAdminConfigurationDbContext { - public IdentityServerConfigurationDbContext(DbContextOptions options, ConfigurationStoreOptions storeOptions) - : base(options, storeOptions) + public IdentityServerConfigurationDbContext(DbContextOptions options) + : base(options) { } diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerPersistedGrantDbContext.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerPersistedGrantDbContext.cs index 201f9dac8..37374203c 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerPersistedGrantDbContext.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/DbContexts/IdentityServerPersistedGrantDbContext.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using Duende.IdentityServer.EntityFramework.DbContexts; -using Duende.IdentityServer.EntityFramework.Options; using Microsoft.EntityFrameworkCore; using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Interfaces; @@ -10,8 +9,8 @@ namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts { public class IdentityServerPersistedGrantDbContext : PersistedGrantDbContext, IAdminPersistedGrantDbContext { - public IdentityServerPersistedGrantDbContext(DbContextOptions options, OperationalStoreOptions storeOptions) - : base(options, storeOptions) + public IdentityServerPersistedGrantDbContext(DbContextOptions options) + : base(options) { } } diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Helpers/DbMigrationHelpers.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Helpers/DbMigrationHelpers.cs index 36e06b5b3..7c9667217 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Helpers/DbMigrationHelpers.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Helpers/DbMigrationHelpers.cs @@ -29,7 +29,7 @@ public static class DbMigrationHelpers /// /// /// - public static async Task ApplyDbMigrationsWithDataSeedAsync ApplyDbMigrationsWithDataSeedAsync( IHost host, bool applyDbMigrationWithDataSeedFromProgramArguments, SeedConfiguration seedConfiguration, DatabaseMigrationsConfiguration databaseMigrationsConfiguration) @@ -42,6 +42,8 @@ public static class DbMigrationHelpers where TUser : IdentityUser, new() where TRole : IdentityRole, new() { + var migrationComplete = false; + using (var serviceScope = host.Services.CreateScope()) { var services = serviceScope.ServiceProvider; @@ -49,18 +51,22 @@ public static class DbMigrationHelpers if ((databaseMigrationsConfiguration != null && databaseMigrationsConfiguration.ApplyDatabaseMigrations) || (applyDbMigrationWithDataSeedFromProgramArguments)) { - await EnsureDatabasesMigratedAsync(services); + migrationComplete = await EnsureDatabasesMigratedAsync(services); } if ((seedConfiguration != null && seedConfiguration.ApplySeed) || (applyDbMigrationWithDataSeedFromProgramArguments)) { - await EnsureSeedDataAsync(services); + var seedComplete = await EnsureSeedDataAsync(services); + + return migrationComplete && seedComplete; } } + + return migrationComplete; } - public static async Task EnsureDatabasesMigratedAsync(IServiceProvider services) + public static async Task EnsureDatabasesMigratedAsync(IServiceProvider services) where TIdentityDbContext : DbContext where TPersistedGrantDbContext : DbContext where TConfigurationDbContext : DbContext @@ -68,41 +74,51 @@ public static async Task EnsureDatabasesMigratedAsync().CreateScope()) { using (var context = scope.ServiceProvider.GetRequiredService()) { await context.Database.MigrateAsync(); + pendingMigrationCount += (await context.Database.GetPendingMigrationsAsync()).Count(); } using (var context = scope.ServiceProvider.GetRequiredService()) { await context.Database.MigrateAsync(); + pendingMigrationCount += (await context.Database.GetPendingMigrationsAsync()).Count(); } using (var context = scope.ServiceProvider.GetRequiredService()) { await context.Database.MigrateAsync(); + pendingMigrationCount += (await context.Database.GetPendingMigrationsAsync()).Count(); } using (var context = scope.ServiceProvider.GetRequiredService()) { await context.Database.MigrateAsync(); + pendingMigrationCount += (await context.Database.GetPendingMigrationsAsync()).Count(); } using (var context = scope.ServiceProvider.GetRequiredService()) { await context.Database.MigrateAsync(); + pendingMigrationCount += (await context.Database.GetPendingMigrationsAsync()).Count(); } using (var context = scope.ServiceProvider.GetRequiredService()) { await context.Database.MigrateAsync(); + pendingMigrationCount += (await context.Database.GetPendingMigrationsAsync()).Count(); } } + + return pendingMigrationCount == 0; } - public static async Task EnsureSeedDataAsync(IServiceProvider serviceProvider) + public static async Task EnsureSeedDataAsync(IServiceProvider serviceProvider) where TIdentityServerDbContext : DbContext, IAdminConfigurationDbContext where TUser : IdentityUser, new() where TRole : IdentityRole, new() @@ -118,6 +134,8 @@ public static async Task EnsureSeedDataAsync diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.csproj index ddb58c72d..6befff0ff 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared/Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.csproj @@ -1,19 +1,17 @@  - net5.0 + net6.0 DbContexts and Identity entities for the administration of the Duende IdentityServer and Asp.Net Core Identity - + - - diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/20220116154116_UpdateToIS6.Designer.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/20220116154116_UpdateToIS6.Designer.cs new file mode 100644 index 000000000..4dcb93f70 --- /dev/null +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/20220116154116_UpdateToIS6.Designer.cs @@ -0,0 +1,1093 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts; + +#nullable disable + +namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.Migrations.IdentityServerConfiguration +{ + [DbContext(typeof(IdentityServerConfigurationDbContext))] + [Migration("20220116154116_UpdateToIS6")] + partial class UpdateToIS6 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("NonEditable") + .HasColumnType("bit"); + + b.Property("RequireResourceIndicator") + .HasColumnType("bit"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); + + b.Property("Updated") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ApiResources", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Type") + .IsUnique(); + + b.ToTable("ApiResourceClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Key") + .IsUnique(); + + b.ToTable("ApiResourceProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Scope") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId", "Scope") + .IsUnique(); + + b.ToTable("ApiResourceScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ApiResourceId") + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); + + b.HasKey("Id"); + + b.HasIndex("ApiResourceId"); + + b.ToTable("ApiResourceSecrets", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Emphasize") + .HasColumnType("bit"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("NonEditable") + .HasColumnType("bit"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); + + b.Property("Updated") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ApiScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ScopeId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ScopeId", "Type") + .IsUnique(); + + b.ToTable("ApiScopeClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("ScopeId") + .HasColumnType("int"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ScopeId", "Key") + .IsUnique(); + + b.ToTable("ApiScopeProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("AbsoluteRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenType") + .HasColumnType("int"); + + b.Property("AllowAccessTokensViaBrowser") + .HasColumnType("bit"); + + b.Property("AllowOfflineAccess") + .HasColumnType("bit"); + + b.Property("AllowPlainTextPkce") + .HasColumnType("bit"); + + b.Property("AllowRememberConsent") + .HasColumnType("bit"); + + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("AlwaysIncludeUserClaimsInIdToken") + .HasColumnType("bit"); + + b.Property("AlwaysSendClientClaims") + .HasColumnType("bit"); + + b.Property("AuthorizationCodeLifetime") + .HasColumnType("int"); + + b.Property("BackChannelLogoutSessionRequired") + .HasColumnType("bit"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("CibaLifetime") + .HasColumnType("int"); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientName") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientUri") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("ConsentLifetime") + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("DeviceCodeLifetime") + .HasColumnType("int"); + + b.Property("EnableLocalLogin") + .HasColumnType("bit"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("FrontChannelLogoutSessionRequired") + .HasColumnType("bit"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("IdentityTokenLifetime") + .HasColumnType("int"); + + b.Property("IncludeJwtId") + .HasColumnType("bit"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("LogoUri") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("NonEditable") + .HasColumnType("bit"); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("PollingInterval") + .HasColumnType("int"); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("RefreshTokenExpiration") + .HasColumnType("int"); + + b.Property("RefreshTokenUsage") + .HasColumnType("int"); + + b.Property("RequireClientSecret") + .HasColumnType("bit"); + + b.Property("RequireConsent") + .HasColumnType("bit"); + + b.Property("RequirePkce") + .HasColumnType("bit"); + + b.Property("RequireRequestObject") + .HasColumnType("bit"); + + b.Property("SlidingRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("UpdateAccessTokenClaimsOnRefresh") + .HasColumnType("bit"); + + b.Property("Updated") + .HasColumnType("datetime2"); + + b.Property("UserCodeType") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserSsoLifetime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique(); + + b.ToTable("Clients", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Type", "Value") + .IsUnique(); + + b.ToTable("ClientClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Origin") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Origin") + .IsUnique(); + + b.ToTable("ClientCorsOrigins", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("GrantType") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "GrantType") + .IsUnique(); + + b.ToTable("ClientGrantTypes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Provider") + .IsUnique(); + + b.ToTable("ClientIdPRestrictions", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("PostLogoutRedirectUri") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "PostLogoutRedirectUri") + .IsUnique(); + + b.ToTable("ClientPostLogoutRedirectUris", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Key") + .IsUnique(); + + b.ToTable("ClientProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("RedirectUri") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "RedirectUri") + .IsUnique(); + + b.ToTable("ClientRedirectUris", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Scope") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId", "Scope") + .IsUnique(); + + b.ToTable("ClientScopes", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("ClientSecrets", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityProvider", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("NonEditable") + .HasColumnType("bit"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scheme") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("Updated") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("Scheme") + .IsUnique(); + + b.ToTable("IdentityProviders", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Emphasize") + .HasColumnType("bit"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("NonEditable") + .HasColumnType("bit"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); + + b.Property("Updated") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("IdentityResources", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("IdentityResourceId") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("IdentityResourceId", "Type") + .IsUnique(); + + b.ToTable("IdentityResourceClaims", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("IdentityResourceId") + .HasColumnType("int"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.HasKey("Id"); + + b.HasIndex("IdentityResourceId", "Key") + .IsUnique(); + + b.ToTable("IdentityResourceProperties", (string)null); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiResource", "ApiResource") + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApiResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiScope", "Scope") + .WithMany("UserClaims") + .HasForeignKey("ScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scope"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.ApiScope", "Scope") + .WithMany("Properties") + .HasForeignKey("ScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scope"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.Client", "Client") + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", "IdentityResource") + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IdentityResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => + { + b.HasOne("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", "IdentityResource") + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IdentityResource"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/20220116154116_UpdateToIS6.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/20220116154116_UpdateToIS6.cs new file mode 100644 index 000000000..2278d1c29 --- /dev/null +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/20220116154116_UpdateToIS6.cs @@ -0,0 +1,455 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.Migrations.IdentityServerConfiguration +{ + public partial class UpdateToIS6 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId", + table: "IdentityResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId", + table: "IdentityResourceClaims"); + + migrationBuilder.DropIndex( + name: "IX_ClientScopes_ClientId", + table: "ClientScopes"); + + migrationBuilder.DropIndex( + name: "IX_ClientRedirectUris_ClientId", + table: "ClientRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientProperties_ClientId", + table: "ClientProperties"); + + migrationBuilder.DropIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId", + table: "ClientPostLogoutRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientIdPRestrictions_ClientId", + table: "ClientIdPRestrictions"); + + migrationBuilder.DropIndex( + name: "IX_ClientGrantTypes_ClientId", + table: "ClientGrantTypes"); + + migrationBuilder.DropIndex( + name: "IX_ClientCorsOrigins_ClientId", + table: "ClientCorsOrigins"); + + migrationBuilder.DropIndex( + name: "IX_ClientClaims_ClientId", + table: "ClientClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeProperties_ScopeId", + table: "ApiScopeProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeClaims_ScopeId", + table: "ApiScopeClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceScopes_ApiResourceId", + table: "ApiResourceScopes"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceProperties_ApiResourceId", + table: "ApiResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceClaims_ApiResourceId", + table: "ApiResourceClaims"); + + migrationBuilder.AddColumn( + name: "Created", + table: "IdentityProviders", + type: "datetime2", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "LastAccessed", + table: "IdentityProviders", + type: "datetime2", + nullable: true); + + migrationBuilder.AddColumn( + name: "NonEditable", + table: "IdentityProviders", + type: "bit", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Updated", + table: "IdentityProviders", + type: "datetime2", + nullable: true); + + migrationBuilder.AddColumn( + name: "CibaLifetime", + table: "Clients", + type: "int", + nullable: true); + + migrationBuilder.AddColumn( + name: "PollingInterval", + table: "Clients", + type: "int", + nullable: true); + + migrationBuilder.AlterColumn( + name: "RedirectUri", + table: "ClientRedirectUris", + type: "nvarchar(400)", + maxLength: 400, + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(2000)", + oldMaxLength: 2000); + + migrationBuilder.AlterColumn( + name: "PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + type: "nvarchar(400)", + maxLength: 400, + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(2000)", + oldMaxLength: 2000); + + migrationBuilder.AddColumn( + name: "Created", + table: "ApiScopes", + type: "datetime2", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "LastAccessed", + table: "ApiScopes", + type: "datetime2", + nullable: true); + + migrationBuilder.AddColumn( + name: "NonEditable", + table: "ApiScopes", + type: "bit", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Updated", + table: "ApiScopes", + type: "datetime2", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId_Key", + table: "IdentityResourceProperties", + columns: new[] { "IdentityResourceId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId_Type", + table: "IdentityResourceClaims", + columns: new[] { "IdentityResourceId", "Type" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityProviders_Scheme", + table: "IdentityProviders", + column: "Scheme", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientScopes_ClientId_Scope", + table: "ClientScopes", + columns: new[] { "ClientId", "Scope" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientRedirectUris_ClientId_RedirectUri", + table: "ClientRedirectUris", + columns: new[] { "ClientId", "RedirectUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientProperties_ClientId_Key", + table: "ClientProperties", + columns: new[] { "ClientId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId_PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + columns: new[] { "ClientId", "PostLogoutRedirectUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientIdPRestrictions_ClientId_Provider", + table: "ClientIdPRestrictions", + columns: new[] { "ClientId", "Provider" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientGrantTypes_ClientId_GrantType", + table: "ClientGrantTypes", + columns: new[] { "ClientId", "GrantType" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientCorsOrigins_ClientId_Origin", + table: "ClientCorsOrigins", + columns: new[] { "ClientId", "Origin" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ClientClaims_ClientId_Type_Value", + table: "ClientClaims", + columns: new[] { "ClientId", "Type", "Value" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeProperties_ScopeId_Key", + table: "ApiScopeProperties", + columns: new[] { "ScopeId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeClaims_ScopeId_Type", + table: "ApiScopeClaims", + columns: new[] { "ScopeId", "Type" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceScopes_ApiResourceId_Scope", + table: "ApiResourceScopes", + columns: new[] { "ApiResourceId", "Scope" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceProperties_ApiResourceId_Key", + table: "ApiResourceProperties", + columns: new[] { "ApiResourceId", "Key" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceClaims_ApiResourceId_Type", + table: "ApiResourceClaims", + columns: new[] { "ApiResourceId", "Type" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId_Key", + table: "IdentityResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId_Type", + table: "IdentityResourceClaims"); + + migrationBuilder.DropIndex( + name: "IX_IdentityProviders_Scheme", + table: "IdentityProviders"); + + migrationBuilder.DropIndex( + name: "IX_ClientScopes_ClientId_Scope", + table: "ClientScopes"); + + migrationBuilder.DropIndex( + name: "IX_ClientRedirectUris_ClientId_RedirectUri", + table: "ClientRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientProperties_ClientId_Key", + table: "ClientProperties"); + + migrationBuilder.DropIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId_PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris"); + + migrationBuilder.DropIndex( + name: "IX_ClientIdPRestrictions_ClientId_Provider", + table: "ClientIdPRestrictions"); + + migrationBuilder.DropIndex( + name: "IX_ClientGrantTypes_ClientId_GrantType", + table: "ClientGrantTypes"); + + migrationBuilder.DropIndex( + name: "IX_ClientCorsOrigins_ClientId_Origin", + table: "ClientCorsOrigins"); + + migrationBuilder.DropIndex( + name: "IX_ClientClaims_ClientId_Type_Value", + table: "ClientClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeProperties_ScopeId_Key", + table: "ApiScopeProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiScopeClaims_ScopeId_Type", + table: "ApiScopeClaims"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceScopes_ApiResourceId_Scope", + table: "ApiResourceScopes"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceProperties_ApiResourceId_Key", + table: "ApiResourceProperties"); + + migrationBuilder.DropIndex( + name: "IX_ApiResourceClaims_ApiResourceId_Type", + table: "ApiResourceClaims"); + + migrationBuilder.DropColumn( + name: "Created", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "LastAccessed", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "NonEditable", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "Updated", + table: "IdentityProviders"); + + migrationBuilder.DropColumn( + name: "CibaLifetime", + table: "Clients"); + + migrationBuilder.DropColumn( + name: "PollingInterval", + table: "Clients"); + + migrationBuilder.DropColumn( + name: "Created", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "LastAccessed", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "NonEditable", + table: "ApiScopes"); + + migrationBuilder.DropColumn( + name: "Updated", + table: "ApiScopes"); + + migrationBuilder.AlterColumn( + name: "RedirectUri", + table: "ClientRedirectUris", + type: "nvarchar(2000)", + maxLength: 2000, + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(400)", + oldMaxLength: 400); + + migrationBuilder.AlterColumn( + name: "PostLogoutRedirectUri", + table: "ClientPostLogoutRedirectUris", + type: "nvarchar(2000)", + maxLength: 2000, + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(400)", + oldMaxLength: 400); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceProperties_IdentityResourceId", + table: "IdentityResourceProperties", + column: "IdentityResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityResourceClaims_IdentityResourceId", + table: "IdentityResourceClaims", + column: "IdentityResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientScopes_ClientId", + table: "ClientScopes", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientRedirectUris_ClientId", + table: "ClientRedirectUris", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientProperties_ClientId", + table: "ClientProperties", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientPostLogoutRedirectUris_ClientId", + table: "ClientPostLogoutRedirectUris", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientIdPRestrictions_ClientId", + table: "ClientIdPRestrictions", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientGrantTypes_ClientId", + table: "ClientGrantTypes", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientCorsOrigins_ClientId", + table: "ClientCorsOrigins", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ClientClaims_ClientId", + table: "ClientClaims", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeProperties_ScopeId", + table: "ApiScopeProperties", + column: "ScopeId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiScopeClaims_ScopeId", + table: "ApiScopeClaims", + column: "ScopeId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceScopes_ApiResourceId", + table: "ApiResourceScopes", + column: "ApiResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceProperties_ApiResourceId", + table: "ApiResourceProperties", + column: "ApiResourceId"); + + migrationBuilder.CreateIndex( + name: "IX_ApiResourceClaims_ApiResourceId", + table: "ApiResourceClaims", + column: "ApiResourceId"); + } + } +} diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs index 98cbabe9f..ebf7c44a8 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Migrations/IdentityServerConfiguration/IdentityServerConfigurationDbContextModelSnapshot.cs @@ -6,6 +6,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Shared.DbContexts; +#nullable disable + namespace Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.Migrations.IdentityServerConfiguration { [DbContext(typeof(IdentityServerConfigurationDbContext))] @@ -15,16 +17,18 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.12") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("AllowedAccessTokenSigningAlgorithms") .HasMaxLength(100) @@ -69,15 +73,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Name") .IsUnique(); - b.ToTable("ApiResources"); + b.ToTable("ApiResources", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ApiResourceId") .HasColumnType("int"); @@ -89,17 +94,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Type") + .IsUnique(); - b.ToTable("ApiResourceClaims"); + b.ToTable("ApiResourceClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ApiResourceId") .HasColumnType("int"); @@ -116,17 +123,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Key") + .IsUnique(); - b.ToTable("ApiResourceProperties"); + b.ToTable("ApiResourceProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ApiResourceId") .HasColumnType("int"); @@ -138,17 +147,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ApiResourceId"); + b.HasIndex("ApiResourceId", "Scope") + .IsUnique(); - b.ToTable("ApiResourceScopes"); + b.ToTable("ApiResourceScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ApiResourceId") .HasColumnType("int"); @@ -177,15 +188,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ApiResourceId"); - b.ToTable("ApiResourceSecrets"); + b.ToTable("ApiResourceSecrets", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScope", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Created") + .HasColumnType("datetime2"); b.Property("Description") .HasMaxLength(1000) @@ -201,31 +216,41 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Enabled") .HasColumnType("bit"); + b.Property("LastAccessed") + .HasColumnType("datetime2"); + b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); + b.Property("NonEditable") + .HasColumnType("bit"); + b.Property("Required") .HasColumnType("bit"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); + b.Property("Updated") + .HasColumnType("datetime2"); + b.HasKey("Id"); b.HasIndex("Name") .IsUnique(); - b.ToTable("ApiScopes"); + b.ToTable("ApiScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ScopeId") .HasColumnType("int"); @@ -237,17 +262,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ScopeId"); + b.HasIndex("ScopeId", "Type") + .IsUnique(); - b.ToTable("ApiScopeClaims"); + b.ToTable("ApiScopeClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("Key") .IsRequired() @@ -264,17 +291,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ScopeId"); + b.HasIndex("ScopeId", "Key") + .IsUnique(); - b.ToTable("ApiScopeProperties"); + b.ToTable("ApiScopeProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.Client", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("AbsoluteRefreshTokenLifetime") .HasColumnType("int"); @@ -317,6 +346,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(2000) .HasColumnType("nvarchar(2000)"); + b.Property("CibaLifetime") + .HasColumnType("int"); + b.Property("ClientClaimsPrefix") .HasMaxLength(200) .HasColumnType("nvarchar(200)"); @@ -380,6 +412,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(200) .HasColumnType("nvarchar(200)"); + b.Property("PollingInterval") + .HasColumnType("int"); + b.Property("ProtocolType") .IsRequired() .HasMaxLength(200) @@ -424,15 +459,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientId") .IsUnique(); - b.ToTable("Clients"); + b.ToTable("Clients", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -449,17 +485,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Type", "Value") + .IsUnique(); - b.ToTable("ClientClaims"); + b.ToTable("ClientClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -471,17 +509,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Origin") + .IsUnique(); - b.ToTable("ClientCorsOrigins"); + b.ToTable("ClientCorsOrigins", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientGrantType", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -493,17 +533,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "GrantType") + .IsUnique(); - b.ToTable("ClientGrantTypes"); + b.ToTable("ClientGrantTypes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -515,39 +557,43 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Provider") + .IsUnique(); - b.ToTable("ClientIdPRestrictions"); + b.ToTable("ClientIdPRestrictions", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); b.Property("PostLogoutRedirectUri") .IsRequired() - .HasMaxLength(2000) - .HasColumnType("nvarchar(2000)"); + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "PostLogoutRedirectUri") + .IsUnique(); - b.ToTable("ClientPostLogoutRedirectUris"); + b.ToTable("ClientPostLogoutRedirectUris", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -564,39 +610,43 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Key") + .IsUnique(); - b.ToTable("ClientProperties"); + b.ToTable("ClientProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); b.Property("RedirectUri") .IsRequired() - .HasMaxLength(2000) - .HasColumnType("nvarchar(2000)"); + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "RedirectUri") + .IsUnique(); - b.ToTable("ClientRedirectUris"); + b.ToTable("ClientRedirectUris", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientScope", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -608,17 +658,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("ClientId"); + b.HasIndex("ClientId", "Scope") + .IsUnique(); - b.ToTable("ClientScopes"); + b.ToTable("ClientScopes", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ClientSecret", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("ClientId") .HasColumnType("int"); @@ -647,15 +699,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientId"); - b.ToTable("ClientSecrets"); + b.ToTable("ClientSecrets", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityProvider", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Created") + .HasColumnType("datetime2"); b.Property("DisplayName") .HasMaxLength(200) @@ -664,6 +720,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Enabled") .HasColumnType("bit"); + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("NonEditable") + .HasColumnType("bit"); + b.Property("Properties") .HasColumnType("nvarchar(max)"); @@ -677,17 +739,24 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(20) .HasColumnType("nvarchar(20)"); + b.Property("Updated") + .HasColumnType("datetime2"); + b.HasKey("Id"); - b.ToTable("IdentityProviders"); + b.HasIndex("Scheme") + .IsUnique(); + + b.ToTable("IdentityProviders", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResource", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("Created") .HasColumnType("datetime2"); @@ -728,15 +797,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Name") .IsUnique(); - b.ToTable("IdentityResources"); + b.ToTable("IdentityResources", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("IdentityResourceId") .HasColumnType("int"); @@ -748,17 +818,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("IdentityResourceId"); + b.HasIndex("IdentityResourceId", "Type") + .IsUnique(); - b.ToTable("IdentityResourceClaims"); + b.ToTable("IdentityResourceClaims", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); b.Property("IdentityResourceId") .HasColumnType("int"); @@ -775,9 +847,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("IdentityResourceId"); + b.HasIndex("IdentityResourceId", "Key") + .IsUnique(); - b.ToTable("IdentityResourceProperties"); + b.ToTable("IdentityResourceProperties", (string)null); }); modelBuilder.Entity("Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim", b => diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.csproj index c57fb7f39..ec5249557 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer/Skoruba.Duende.IdentityServer.Admin.EntityFramework.SqlServer.csproj @@ -1,19 +1,16 @@  - net5.0 + net6.0 Entity Framework layer for the administration of the Duende IdentityServer and Asp.Net Core Identity with SqlServer support - - + - - diff --git a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework/Skoruba.Duende.IdentityServer.Admin.EntityFramework.csproj b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework/Skoruba.Duende.IdentityServer.Admin.EntityFramework.csproj index 3d6c59dde..e40def456 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework/Skoruba.Duende.IdentityServer.Admin.EntityFramework.csproj +++ b/src/Skoruba.Duende.IdentityServer.Admin.EntityFramework/Skoruba.Duende.IdentityServer.Admin.EntityFramework.csproj @@ -1,12 +1,13 @@  - net5.0 + net6.0 Entity Framework layer for the administration of the Duende IdentityServer - + + diff --git a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Controllers/IdentityController.cs b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Controllers/IdentityController.cs index ffcb914f9..87f971752 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Controllers/IdentityController.cs +++ b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Controllers/IdentityController.cs @@ -124,12 +124,12 @@ public async Task Users(int? page, string search) } [HttpGet] - public async Task RoleUsers(string id, int? page, string search) + public async Task RoleUsers(string roleId, int? page, string search) { ViewBag.Search = search; - var roleUsers = await _identityService.GetRoleUsersAsync(id, search, page ?? 1); + var roleUsers = await _identityService.GetRoleUsersAsync(roleId, search, page ?? 1); - var roleDto = await _identityService.GetRoleAsync(id); + var roleDto = await _identityService.GetRoleAsync(roleId); ViewData["RoleName"] = roleDto.Name; return View(roleUsers); diff --git a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Configuration/Client/Section/Token.cshtml b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Configuration/Client/Section/Token.cshtml index 62fad0a4c..f575ec3bd 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Configuration/Client/Section/Token.cshtml +++ b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Configuration/Client/Section/Token.cshtml @@ -85,6 +85,26 @@ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ -
-
- @await Html.PartialAsync("Common/Pager", new Pager { Action = "PersistedGrant", PageSize = Model.PageSize, TotalCount = Model.TotalCount }) -
-
+
+
+ @await Html.PartialAsync("Common/Pager", new Pager { Action = "PersistedGrant", PageSize = Model.PageSize, TotalCount = Model.TotalCount }) +
+
- - + + \ No newline at end of file diff --git a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/Roles.cshtml b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/Roles.cshtml index f5f8061a3..2b2236e5d 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/Roles.cshtml +++ b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/Roles.cshtml @@ -44,7 +44,7 @@ @Localizer["TableButtonEdit"] - @Localizer["TableButtonUsers"] + @Localizer["TableButtonUsers"] @role.Name diff --git a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/UserRolesDelete.cshtml b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/UserRolesDelete.cshtml index 9b0f660bb..48877ef6c 100644 --- a/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/UserRolesDelete.cshtml +++ b/src/Skoruba.Duende.IdentityServer.Admin.UI/Areas/AdminUI/Views/Identity/UserRolesDelete.cshtml @@ -37,6 +37,15 @@
@Localizer["SubTitle"]
+
+ +
+ +
+
+