[
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings \n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Microsoft Azure ApplicationInsights config file\nApplicationInsights.config\n\n# Windows Store app package directory\nAppPackages/\nBundleArtifacts/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n"
  },
  {
    "path": "API/API.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore.Authentication.JwtBearer\" Version=\"3.1.18\" />\n  </ItemGroup>\n\n\n</Project>\n"
  },
  {
    "path": "API/Controllers/WeatherForecastController.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace API.Controllers\n{\n    [Authorize]\n    [ApiController]\n    [Route(\"[controller]\")]\n    public class WeatherForecastController : ControllerBase\n    {\n        private static readonly string[] Summaries =\n        {\n            \"Freezing\", \"Bracing\", \"Chilly\", \"Cool\", \"Mild\", \"Warm\", \"Balmy\", \"Hot\", \"Sweltering\", \"Scorching\"\n        };\n\n        [HttpGet]\n        public IEnumerable<WeatherForecast> Get()\n        {\n            var rng = new Random();\n\n            return Enumerable.Range(1, 5).Select(index => new WeatherForecast\n            {\n                Date = DateTime.Now.AddDays(index),\n                TemperatureC = rng.Next(-20, 55),\n                Summary = Summaries[rng.Next(Summaries.Length)]\n            }).ToArray();\n        }\n    }\n}\n"
  },
  {
    "path": "API/Program.cs",
    "content": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace API\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateHostBuilder(args).Build().Run();\n        }\n\n        public static IHostBuilder CreateHostBuilder(string[] args) =>\n            Host.CreateDefaultBuilder(args)\n                .ConfigureWebHostDefaults(webBuilder =>\n                {\n                    webBuilder.UseStartup<Startup>();\n                });\n    }\n}\n"
  },
  {
    "path": "API/Properties/launchSettings.json",
    "content": "﻿{\n  \"profiles\": {\n    \"API\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"weatherforecast\",\n      \"applicationUrl\": \"https://localhost:5001\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "API/Startup.cs",
    "content": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace API\n{\n    public class Startup\n    {\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddControllers();\n\n            services.AddAuthentication(\"Bearer\")\n                .AddJwtBearer(\"Bearer\", options =>\n                {\n                    options.Audience = \"api1\";\n                    options.Authority = \"https://localhost:5000\";\n                });\n        }\n\n        public void Configure(IApplicationBuilder app)\n        {\n            app.UseDeveloperExceptionPage();\n            app.UseHttpsRedirection();\n\n            app.UseRouting();\n\n            app.UseAuthentication();\n            app.UseAuthorization();\n\n            app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());\n        }\n    }\n}\n"
  },
  {
    "path": "API/WeatherForecast.cs",
    "content": "using System;\n\nnamespace API\n{\n    public class WeatherForecast\n    {\n        public DateTime Date { get; set; }\n\n        public int TemperatureC { get; set; }\n\n        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);\n\n        public string Summary { get; set; }\n    }\n}\n"
  },
  {
    "path": "Client/Client.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore.Authentication.OpenIdConnect\" Version=\"3.1.18\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Client/Controllers/HomeController.cs",
    "content": "﻿using System;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Authentication;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace Client.Controllers\n{\n    public class HomeController : Controller\n    {\n        public IActionResult Index()\n        {\n            return View();\n        }\n\n        [Authorize]\n        public IActionResult Privacy() => View();\n\n        [Authorize]\n        [HttpGet(\"/call-api\")]\n        public async Task<IActionResult> CallApi()\n        {\n            var accessToken = await HttpContext.GetTokenAsync(\"access_token\");\n            if (accessToken == null) throw new InvalidOperationException(\"Could not find access token\");\n            \n            var client = new HttpClient(); // you shouldn't do this. Instead use IHttpClientFactory\n            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(\"Bearer\", accessToken);\n\n            var response = await client.GetAsync(\"https://localhost:5001/weatherforecast\");\n\n            return Ok(response.IsSuccessStatusCode \n                ? \"API access authorized!\" : $\"API access failed. Status code: {response.StatusCode}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Client/Program.cs",
    "content": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Client\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateHostBuilder(args).Build().Run();\n        }\n\n        public static IHostBuilder CreateHostBuilder(string[] args) =>\n            Host.CreateDefaultBuilder(args)\n                .ConfigureWebHostDefaults(webBuilder =>\n                {\n                    webBuilder.UseStartup<Startup>();\n                });\n    }\n}\n"
  },
  {
    "path": "Client/Properties/launchSettings.json",
    "content": "﻿{\n  \"profiles\": {\n    \"Client\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:5002\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Client/Startup.cs",
    "content": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Client\n{\n    public class Startup\n    {\n\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddControllersWithViews();\n\n            services.AddAuthentication(options =>\n                {\n                    options.DefaultScheme = \"cookie\";\n                    options.DefaultChallengeScheme = \"oidc\";\n                })\n                .AddCookie(\"cookie\")\n                .AddOpenIdConnect(\"oidc\", options =>\n                {\n                    options.Authority = \"https://localhost:5000\";\n                    options.ClientId = \"oidcClient\";\n                    options.ClientSecret = \"SuperSecretPassword\";\n\n                    options.ResponseType = \"code\";\n                    options.UsePkce = true;\n                    options.ResponseMode = \"query\";\n\n                    // options.CallbackPath = \"/signin-oidc\"; // default redirect URI\n                    \n                    // options.Scope.Add(\"oidc\"); // default scope\n                    // options.Scope.Add(\"profile\"); // default scope\n                    options.Scope.Add(\"api1.read\");\n                    options.SaveTokens = true;\n                });\n        }\n\n        public void Configure(IApplicationBuilder app)\n        {\n            app.UseDeveloperExceptionPage();\n            app.UseHttpsRedirection();\n\n            app.UseStaticFiles();\n            app.UseRouting();\n\n            app.UseAuthentication();\n            app.UseAuthorization();\n\n            app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());\n        }\n    }\n}\n"
  },
  {
    "path": "Client/Views/Home/Index.cshtml",
    "content": "﻿@{\n    ViewData[\"Title\"] = \"Home Page\";\n}\n\n<div class=\"text-center\">\n    <h1 class=\"display-4\">Welcome</h1>\n    <p>Learn about <a href=\"https://docs.microsoft.com/aspnet/core\">building Web apps with ASP.NET Core</a>.</p>\n</div>\n"
  },
  {
    "path": "Client/Views/Home/Privacy.cshtml",
    "content": "﻿@{\n    ViewData[\"Title\"] = \"Privacy Policy\";\n}\n<h1>@ViewData[\"Title\"]</h1>\n\n<p>Use this page to detail your site's privacy policy.</p>\n\n<a asp-action=\"CallApi\" class=\"btn btn-primary\">Call Api</a>"
  },
  {
    "path": "Client/Views/Shared/_Layout.cshtml",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>@ViewData[\"Title\"] - Client</title>\n    <link rel=\"stylesheet\" href=\"~/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.css\" />\n</head>\n<body>\n    <header>\n        <nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\">\n            <div class=\"container\">\n                <a class=\"navbar-brand\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\">Client</a>\n                <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <div class=\"navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse\">\n                    <ul class=\"navbar-nav flex-grow-1\">\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\">Home</a>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\">Privacy</a>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </nav>\n    </header>\n    <div class=\"container\">\n        <main role=\"main\" class=\"pb-3\">\n            @RenderBody()\n        </main>\n    </div>\n\n    <footer class=\"border-top footer text-muted\">\n        <div class=\"container\">\n            &copy; 2020 - Client - <a asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\">Privacy</a>\n        </div>\n    </footer>\n    <script src=\"~/js/jquery.min.js\"></script>\n    <script src=\"~/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"~/js/site.js\" asp-append-version=\"true\"></script>\n    @RenderSection(\"Scripts\", required: false)\n</body>\n</html>\n"
  },
  {
    "path": "Client/Views/_ViewImports.cshtml",
    "content": "﻿@using Client\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n"
  },
  {
    "path": "Client/Views/_ViewStart.cshtml",
    "content": "﻿@{\n    Layout = \"_Layout\";\n}\n"
  },
  {
    "path": "Client/wwwroot/css/site.css",
    "content": "﻿/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\nfor details on configuring this project to bundle and minify static web assets. */\n\na.navbar-brand {\n  white-space: normal;\n  text-align: center;\n  word-break: break-all;\n}\n\n/* Provide sufficient contrast against white background */\na {\n  color: #0366d6;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\n.nav-pills .nav-link.active, .nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\n/* Sticky footer styles\n-------------------------------------------------- */\nhtml {\n  font-size: 14px;\n}\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\n.border-top {\n  border-top: 1px solid #e5e5e5;\n}\n.border-bottom {\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.box-shadow {\n  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);\n}\n\nbutton.accept-policy {\n  font-size: 1rem;\n  line-height: inherit;\n}\n\n/* Sticky footer styles\n-------------------------------------------------- */\nhtml {\n  position: relative;\n  min-height: 100%;\n}\n\nbody {\n  /* Margin bottom by footer height */\n  margin-bottom: 60px;\n}\n.footer {\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  white-space: nowrap;\n  line-height: 60px; /* Vertically center the text there */\n}\n"
  },
  {
    "path": "IdentityProvider/ApplicationDbContext.cs",
    "content": "using Microsoft.AspNetCore.Identity.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace IdentityProvider\n{\n    public class ApplicationDbContext : IdentityDbContext\n    {\n        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }\n    }\n\n}"
  },
  {
    "path": "IdentityProvider/Config.cs",
    "content": "using System.Collections.Generic;\nusing System.Security.Claims;\nusing Duende.IdentityServer;\nusing Duende.IdentityServer.Models;\nusing Duende.IdentityServer.Test;\nusing IdentityModel;\n\nnamespace IdentityProvider\n{\n    internal class Clients\n    {\n        public static IEnumerable<Client> Get()\n        {\n            return new List<Client>\n            {\n                new Client\n                {\n                    ClientId = \"oauthClient\",\n                    ClientName = \"Example client application using client credentials\",\n                    AllowedGrantTypes = GrantTypes.ClientCredentials,\n                    ClientSecrets = new List<Secret> {new Secret(\"SuperSecretPassword\".Sha256())}, // change me!\n                    AllowedScopes = new List<string> {\"api1.read\"}\n                },\n                new Client\n                {\n                    ClientId = \"oidcClient\",\n                    ClientName = \"Example Client Application\",\n                    ClientSecrets = new List<Secret> {new Secret(\"SuperSecretPassword\".Sha256())}, // change me!\n                    \n                    AllowedGrantTypes = GrantTypes.Code,\n                    RedirectUris = new List<string> {\"https://localhost:5002/signin-oidc\"},\n                    AllowedScopes = new List<string>\n                    {\n                        IdentityServerConstants.StandardScopes.OpenId,\n                        IdentityServerConstants.StandardScopes.Profile,\n                        IdentityServerConstants.StandardScopes.Email,\n                        \"role\",\n                        \"api1.read\"\n                    },\n\n                    RequirePkce = true,\n                    AllowPlainTextPkce = false\n                }\n            };\n        }\n    }\n\n    internal class Resources\n    {\n        public static IEnumerable<IdentityResource> GetIdentityResources()\n        {\n            return new[]\n            {\n                new IdentityResources.OpenId(),\n                new IdentityResources.Profile(),\n                new IdentityResources.Email(),\n                new IdentityResource\n                {\n                    Name = \"role\",\n                    UserClaims = new List<string> {\"role\"}\n                }\n            };\n        }\n\n        public static IEnumerable<ApiResource> GetApiResources()\n        {\n            return new[]\n            {\n                new ApiResource\n                {\n                    Name = \"api1\",\n                    DisplayName = \"API #1\",\n                    Description = \"Allow the application to access API #1 on your behalf\",\n                    Scopes = new List<string> {\"api1.read\", \"api1.write\"},\n                    ApiSecrets = new List<Secret> {new Secret(\"ScopeSecret\".Sha256())}, // change me!\n                    UserClaims = new List<string> {\"role\"}\n                }\n            };\n        }\n\n        public static IEnumerable<ApiScope> GetApiScopes()\n        {\n            return new[]\n            {\n                new ApiScope(\"api1.read\", \"Read Access to API #1\"),\n                new ApiScope(\"api1.write\", \"Write Access to API #1\")\n            };\n        }\n    }\n\n    internal class Users\n    {\n        public static List<TestUser> Get()\n        {\n            return new List<TestUser>\n            {\n                new TestUser\n                {\n                    SubjectId = \"5BE86359-073C-434B-AD2D-A3932222DABE\",\n                    Username = \"scott\",\n                    Password = \"password\",\n                    Claims = new List<Claim>\n                    {\n                        new Claim(JwtClaimTypes.Email, \"scott@scottbrady91.com\"),\n                        new Claim(JwtClaimTypes.Role, \"admin\")\n                    }\n                }\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/IdentityProvider.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Duende.IdentityServer\" Version=\"5.2.2\" />\n    <PackageReference Include=\"Duende.IdentityServer.AspNetIdentity\" Version=\"5.2.2\" />\n    <PackageReference Include=\"Duende.IdentityServer.EntityFramework\" Version=\"5.2.2\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Identity.EntityFrameworkCore\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.Design\" Version=\"5.0.9\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.SqlServer\" Version=\"5.0.9\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "IdentityProvider/Migrations/20210828204642_InitialIdentityServerMigration.Designer.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing Duende.IdentityServer.EntityFramework.DbContexts;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Migrations;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnamespace IdentityProvider.Migrations\n{\n    [DbContext(typeof(PersistedGrantDbContext))]\n    [Migration(\"20210828204642_InitialIdentityServerMigration\")]\n    partial class InitialIdentityServerMigration\n    {\n        protected override void BuildTargetModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 128)\n                .HasAnnotation(\"ProductVersion\", \"5.0.9\")\n                .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.DeviceFlowCodes\", b =>\n                {\n                    b.Property<string>(\"UserCode\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientId\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime>(\"CreationTime\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Data\")\n                        .IsRequired()\n                        .HasMaxLength(50000)\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"DeviceCode\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .IsRequired()\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"SessionId\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<string>(\"SubjectId\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"UserCode\");\n\n                    b.HasIndex(\"DeviceCode\")\n                        .IsUnique();\n\n                    b.HasIndex(\"Expiration\");\n\n                    b.ToTable(\"DeviceCodes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.Key\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"Algorithm\")\n                        .IsRequired()\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Data\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<bool>(\"DataProtected\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"IsX509Certificate\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Use\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<int>(\"Version\")\n                        .HasColumnType(\"int\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Use\");\n\n                    b.ToTable(\"Keys\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.PersistedGrant\", b =>\n                {\n                    b.Property<string>(\"Key\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientId\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime?>(\"ConsumedTime\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<DateTime>(\"CreationTime\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Data\")\n                        .IsRequired()\n                        .HasMaxLength(50000)\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"SessionId\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<string>(\"SubjectId\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(50)\n                        .HasColumnType(\"nvarchar(50)\");\n\n                    b.HasKey(\"Key\");\n\n                    b.HasIndex(\"ConsumedTime\");\n\n                    b.HasIndex(\"Expiration\");\n\n                    b.HasIndex(\"SubjectId\", \"ClientId\", \"Type\");\n\n                    b.HasIndex(\"SubjectId\", \"SessionId\", \"Type\");\n\n                    b.ToTable(\"PersistedGrants\");\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/20210828204642_InitialIdentityServerMigration.cs",
    "content": "﻿using System;\nusing Microsoft.EntityFrameworkCore.Migrations;\n\nnamespace IdentityProvider.Migrations\n{\n    public partial class InitialIdentityServerMigration : Migration\n    {\n        protected override void Up(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.CreateTable(\n                name: \"DeviceCodes\",\n                columns: table => new\n                {\n                    UserCode = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    DeviceCode = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    SubjectId = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    SessionId = table.Column<string>(type: \"nvarchar(100)\", maxLength: 100, nullable: true),\n                    ClientId = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    Description = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    CreationTime = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Expiration = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Data = table.Column<string>(type: \"nvarchar(max)\", maxLength: 50000, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_DeviceCodes\", x => x.UserCode);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"Keys\",\n                columns: table => new\n                {\n                    Id = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    Version = table.Column<int>(type: \"int\", nullable: false),\n                    Created = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Use = table.Column<string>(type: \"nvarchar(450)\", nullable: true),\n                    Algorithm = table.Column<string>(type: \"nvarchar(100)\", maxLength: 100, nullable: false),\n                    IsX509Certificate = table.Column<bool>(type: \"bit\", nullable: false),\n                    DataProtected = table.Column<bool>(type: \"bit\", nullable: false),\n                    Data = table.Column<string>(type: \"nvarchar(max)\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_Keys\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"PersistedGrants\",\n                columns: table => new\n                {\n                    Key = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    Type = table.Column<string>(type: \"nvarchar(50)\", maxLength: 50, nullable: false),\n                    SubjectId = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    SessionId = table.Column<string>(type: \"nvarchar(100)\", maxLength: 100, nullable: true),\n                    ClientId = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    Description = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    CreationTime = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Expiration = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    ConsumedTime = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    Data = table.Column<string>(type: \"nvarchar(max)\", maxLength: 50000, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_PersistedGrants\", x => x.Key);\n                });\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_DeviceCodes_DeviceCode\",\n                table: \"DeviceCodes\",\n                column: \"DeviceCode\",\n                unique: true);\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_DeviceCodes_Expiration\",\n                table: \"DeviceCodes\",\n                column: \"Expiration\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_Keys_Use\",\n                table: \"Keys\",\n                column: \"Use\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_PersistedGrants_ConsumedTime\",\n                table: \"PersistedGrants\",\n                column: \"ConsumedTime\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_PersistedGrants_Expiration\",\n                table: \"PersistedGrants\",\n                column: \"Expiration\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_PersistedGrants_SubjectId_ClientId_Type\",\n                table: \"PersistedGrants\",\n                columns: new[] { \"SubjectId\", \"ClientId\", \"Type\" });\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_PersistedGrants_SubjectId_SessionId_Type\",\n                table: \"PersistedGrants\",\n                columns: new[] { \"SubjectId\", \"SessionId\", \"Type\" });\n        }\n\n        protected override void Down(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.DropTable(\n                name: \"DeviceCodes\");\n\n            migrationBuilder.DropTable(\n                name: \"Keys\");\n\n            migrationBuilder.DropTable(\n                name: \"PersistedGrants\");\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/ApplicationDb/20210828205020_InitialIdentityServerMigration.Designer.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing IdentityProvider;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Migrations;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnamespace IdentityProvider.Migrations.ApplicationDb\n{\n    [DbContext(typeof(ApplicationDbContext))]\n    [Migration(\"20210828205020_InitialIdentityServerMigration\")]\n    partial class InitialIdentityServerMigration\n    {\n        protected override void BuildTargetModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 128)\n                .HasAnnotation(\"ProductVersion\", \"5.0.9\")\n                .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRole\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Name\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<string>(\"NormalizedName\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"NormalizedName\")\n                        .IsUnique()\n                        .HasDatabaseName(\"RoleNameIndex\")\n                        .HasFilter(\"[NormalizedName] IS NOT NULL\");\n\n                    b.ToTable(\"AspNetRoles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"RoleId\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"RoleId\");\n\n                    b.ToTable(\"AspNetRoleClaims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUser\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<int>(\"AccessFailedCount\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Email\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<bool>(\"EmailConfirmed\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"LockoutEnabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTimeOffset?>(\"LockoutEnd\")\n                        .HasColumnType(\"datetimeoffset\");\n\n                    b.Property<string>(\"NormalizedEmail\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<string>(\"NormalizedUserName\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<string>(\"PasswordHash\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"PhoneNumber\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<bool>(\"PhoneNumberConfirmed\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"SecurityStamp\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<bool>(\"TwoFactorEnabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"UserName\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"NormalizedEmail\")\n                        .HasDatabaseName(\"EmailIndex\");\n\n                    b.HasIndex(\"NormalizedUserName\")\n                        .IsUnique()\n                        .HasDatabaseName(\"UserNameIndex\")\n                        .HasFilter(\"[NormalizedUserName] IS NOT NULL\");\n\n                    b.ToTable(\"AspNetUsers\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"UserId\");\n\n                    b.ToTable(\"AspNetUserClaims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"ProviderKey\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"ProviderDisplayName\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"LoginProvider\", \"ProviderKey\");\n\n                    b.HasIndex(\"UserId\");\n\n                    b.ToTable(\"AspNetUserLogins\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"RoleId\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"UserId\", \"RoleId\");\n\n                    b.HasIndex(\"RoleId\");\n\n                    b.ToTable(\"AspNetUserRoles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"Value\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.HasKey(\"UserId\", \"LoginProvider\", \"Name\");\n\n                    b.ToTable(\"AspNetUserTokens\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/ApplicationDb/20210828205020_InitialIdentityServerMigration.cs",
    "content": "﻿using System;\nusing Microsoft.EntityFrameworkCore.Migrations;\n\nnamespace IdentityProvider.Migrations.ApplicationDb\n{\n    public partial class InitialIdentityServerMigration : Migration\n    {\n        protected override void Up(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.CreateTable(\n                name: \"AspNetRoles\",\n                columns: table => new\n                {\n                    Id = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    Name = table.Column<string>(type: \"nvarchar(256)\", maxLength: 256, nullable: true),\n                    NormalizedName = table.Column<string>(type: \"nvarchar(256)\", maxLength: 256, nullable: true),\n                    ConcurrencyStamp = table.Column<string>(type: \"nvarchar(max)\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetRoles\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"AspNetUsers\",\n                columns: table => new\n                {\n                    Id = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    UserName = table.Column<string>(type: \"nvarchar(256)\", maxLength: 256, nullable: true),\n                    NormalizedUserName = table.Column<string>(type: \"nvarchar(256)\", maxLength: 256, nullable: true),\n                    Email = table.Column<string>(type: \"nvarchar(256)\", maxLength: 256, nullable: true),\n                    NormalizedEmail = table.Column<string>(type: \"nvarchar(256)\", maxLength: 256, nullable: true),\n                    EmailConfirmed = table.Column<bool>(type: \"bit\", nullable: false),\n                    PasswordHash = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    SecurityStamp = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    ConcurrencyStamp = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    PhoneNumber = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    PhoneNumberConfirmed = table.Column<bool>(type: \"bit\", nullable: false),\n                    TwoFactorEnabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    LockoutEnd = table.Column<DateTimeOffset>(type: \"datetimeoffset\", nullable: true),\n                    LockoutEnabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    AccessFailedCount = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetUsers\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"AspNetRoleClaims\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    RoleId = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    ClaimType = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    ClaimValue = table.Column<string>(type: \"nvarchar(max)\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetRoleClaims\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_AspNetRoleClaims_AspNetRoles_RoleId\",\n                        column: x => x.RoleId,\n                        principalTable: \"AspNetRoles\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"AspNetUserClaims\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    UserId = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    ClaimType = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    ClaimValue = table.Column<string>(type: \"nvarchar(max)\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetUserClaims\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_AspNetUserClaims_AspNetUsers_UserId\",\n                        column: x => x.UserId,\n                        principalTable: \"AspNetUsers\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"AspNetUserLogins\",\n                columns: table => new\n                {\n                    LoginProvider = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    ProviderKey = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    ProviderDisplayName = table.Column<string>(type: \"nvarchar(max)\", nullable: true),\n                    UserId = table.Column<string>(type: \"nvarchar(450)\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetUserLogins\", x => new { x.LoginProvider, x.ProviderKey });\n                    table.ForeignKey(\n                        name: \"FK_AspNetUserLogins_AspNetUsers_UserId\",\n                        column: x => x.UserId,\n                        principalTable: \"AspNetUsers\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"AspNetUserRoles\",\n                columns: table => new\n                {\n                    UserId = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    RoleId = table.Column<string>(type: \"nvarchar(450)\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetUserRoles\", x => new { x.UserId, x.RoleId });\n                    table.ForeignKey(\n                        name: \"FK_AspNetUserRoles_AspNetRoles_RoleId\",\n                        column: x => x.RoleId,\n                        principalTable: \"AspNetRoles\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                    table.ForeignKey(\n                        name: \"FK_AspNetUserRoles_AspNetUsers_UserId\",\n                        column: x => x.UserId,\n                        principalTable: \"AspNetUsers\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"AspNetUserTokens\",\n                columns: table => new\n                {\n                    UserId = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    LoginProvider = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    Name = table.Column<string>(type: \"nvarchar(450)\", nullable: false),\n                    Value = table.Column<string>(type: \"nvarchar(max)\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_AspNetUserTokens\", x => new { x.UserId, x.LoginProvider, x.Name });\n                    table.ForeignKey(\n                        name: \"FK_AspNetUserTokens_AspNetUsers_UserId\",\n                        column: x => x.UserId,\n                        principalTable: \"AspNetUsers\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_AspNetRoleClaims_RoleId\",\n                table: \"AspNetRoleClaims\",\n                column: \"RoleId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"RoleNameIndex\",\n                table: \"AspNetRoles\",\n                column: \"NormalizedName\",\n                unique: true,\n                filter: \"[NormalizedName] IS NOT NULL\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_AspNetUserClaims_UserId\",\n                table: \"AspNetUserClaims\",\n                column: \"UserId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_AspNetUserLogins_UserId\",\n                table: \"AspNetUserLogins\",\n                column: \"UserId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_AspNetUserRoles_RoleId\",\n                table: \"AspNetUserRoles\",\n                column: \"RoleId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"EmailIndex\",\n                table: \"AspNetUsers\",\n                column: \"NormalizedEmail\");\n\n            migrationBuilder.CreateIndex(\n                name: \"UserNameIndex\",\n                table: \"AspNetUsers\",\n                column: \"NormalizedUserName\",\n                unique: true,\n                filter: \"[NormalizedUserName] IS NOT NULL\");\n        }\n\n        protected override void Down(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.DropTable(\n                name: \"AspNetRoleClaims\");\n\n            migrationBuilder.DropTable(\n                name: \"AspNetUserClaims\");\n\n            migrationBuilder.DropTable(\n                name: \"AspNetUserLogins\");\n\n            migrationBuilder.DropTable(\n                name: \"AspNetUserRoles\");\n\n            migrationBuilder.DropTable(\n                name: \"AspNetUserTokens\");\n\n            migrationBuilder.DropTable(\n                name: \"AspNetRoles\");\n\n            migrationBuilder.DropTable(\n                name: \"AspNetUsers\");\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/ApplicationDb/ApplicationDbContextModelSnapshot.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing IdentityProvider;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnamespace IdentityProvider.Migrations.ApplicationDb\n{\n    [DbContext(typeof(ApplicationDbContext))]\n    partial class ApplicationDbContextModelSnapshot : ModelSnapshot\n    {\n        protected override void BuildModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 128)\n                .HasAnnotation(\"ProductVersion\", \"5.0.9\")\n                .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRole\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Name\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<string>(\"NormalizedName\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"NormalizedName\")\n                        .IsUnique()\n                        .HasDatabaseName(\"RoleNameIndex\")\n                        .HasFilter(\"[NormalizedName] IS NOT NULL\");\n\n                    b.ToTable(\"AspNetRoles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"RoleId\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"RoleId\");\n\n                    b.ToTable(\"AspNetRoleClaims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUser\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<int>(\"AccessFailedCount\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Email\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<bool>(\"EmailConfirmed\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"LockoutEnabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTimeOffset?>(\"LockoutEnd\")\n                        .HasColumnType(\"datetimeoffset\");\n\n                    b.Property<string>(\"NormalizedEmail\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<string>(\"NormalizedUserName\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.Property<string>(\"PasswordHash\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"PhoneNumber\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<bool>(\"PhoneNumberConfirmed\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"SecurityStamp\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<bool>(\"TwoFactorEnabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"UserName\")\n                        .HasMaxLength(256)\n                        .HasColumnType(\"nvarchar(256)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"NormalizedEmail\")\n                        .HasDatabaseName(\"EmailIndex\");\n\n                    b.HasIndex(\"NormalizedUserName\")\n                        .IsUnique()\n                        .HasDatabaseName(\"UserNameIndex\")\n                        .HasFilter(\"[NormalizedUserName] IS NOT NULL\");\n\n                    b.ToTable(\"AspNetUsers\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"UserId\");\n\n                    b.ToTable(\"AspNetUserClaims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"ProviderKey\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"ProviderDisplayName\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"LoginProvider\", \"ProviderKey\");\n\n                    b.HasIndex(\"UserId\");\n\n                    b.ToTable(\"AspNetUserLogins\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"RoleId\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.HasKey(\"UserId\", \"RoleId\");\n\n                    b.HasIndex(\"RoleId\");\n\n                    b.ToTable(\"AspNetUserRoles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"Value\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.HasKey(\"UserId\", \"LoginProvider\", \"Name\");\n\n                    b.ToTable(\"AspNetUserTokens\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/ConfigurationDb/20210828204649_InitialIdentityServerMigration.Designer.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing Duende.IdentityServer.EntityFramework.DbContexts;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Migrations;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnamespace IdentityProvider.Migrations.ConfigurationDb\n{\n    [DbContext(typeof(ConfigurationDbContext))]\n    [Migration(\"20210828204649_InitialIdentityServerMigration\")]\n    partial class InitialIdentityServerMigration\n    {\n        protected override void BuildTargetModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 128)\n                .HasAnnotation(\"ProductVersion\", \"5.0.9\")\n                .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"AllowedAccessTokenSigningAlgorithms\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"LastAccessed\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Name\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"NonEditable\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequireResourceIndicator\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"ShowInDiscoveryDocument\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"Updated\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Name\")\n                        .IsUnique();\n\n                    b.ToTable(\"ApiResources\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Scope\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceScopes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(4000)\n                        .HasColumnType(\"nvarchar(4000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceSecrets\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Emphasize\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Name\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Required\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"ShowInDiscoveryDocument\")\n                        .HasColumnType(\"bit\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Name\")\n                        .IsUnique();\n\n                    b.ToTable(\"ApiScopes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ScopeId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ScopeId\");\n\n                    b.ToTable(\"ApiScopeClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<int>(\"ScopeId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ScopeId\");\n\n                    b.ToTable(\"ApiScopeProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.Client\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"AbsoluteRefreshTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<int>(\"AccessTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<int>(\"AccessTokenType\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"AllowAccessTokensViaBrowser\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AllowOfflineAccess\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AllowPlainTextPkce\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AllowRememberConsent\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"AllowedIdentityTokenSigningAlgorithms\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<bool>(\"AlwaysIncludeUserClaimsInIdToken\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AlwaysSendClientClaims\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<int>(\"AuthorizationCodeLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"BackChannelLogoutSessionRequired\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"BackChannelLogoutUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<string>(\"ClientClaimsPrefix\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientId\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<int?>(\"ConsentLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<int>(\"DeviceCodeLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"EnableLocalLogin\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"FrontChannelLogoutSessionRequired\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"FrontChannelLogoutUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<int>(\"IdentityTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"IncludeJwtId\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"LastAccessed\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"LogoUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<bool>(\"NonEditable\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"PairWiseSubjectSalt\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ProtocolType\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<int>(\"RefreshTokenExpiration\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<int>(\"RefreshTokenUsage\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"RequireClientSecret\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequireConsent\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequirePkce\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequireRequestObject\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<int>(\"SlidingRefreshTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"UpdateAccessTokenClaimsOnRefresh\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"Updated\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"UserCodeType\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<int?>(\"UserSsoLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\")\n                        .IsUnique();\n\n                    b.ToTable(\"Clients\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Origin\")\n                        .IsRequired()\n                        .HasMaxLength(150)\n                        .HasColumnType(\"nvarchar(150)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientCorsOrigins\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientGrantType\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"GrantType\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientGrantTypes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Provider\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientIdPRestrictions\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"PostLogoutRedirectUri\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientPostLogoutRedirectUris\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"RedirectUri\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientRedirectUris\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientScope\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Scope\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientScopes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientSecret\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(4000)\n                        .HasColumnType(\"nvarchar(4000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientSecrets\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityProvider\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Properties\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Scheme\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(20)\n                        .HasColumnType(\"nvarchar(20)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.ToTable(\"IdentityProviders\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Emphasize\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Name\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"NonEditable\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Required\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"ShowInDiscoveryDocument\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"Updated\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Name\")\n                        .IsUnique();\n\n                    b.ToTable(\"IdentityResources\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"IdentityResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"IdentityResourceId\");\n\n                    b.ToTable(\"IdentityResourceClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"IdentityResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"IdentityResourceId\");\n\n                    b.ToTable(\"IdentityResourceProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"UserClaims\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"Scopes\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"Secrets\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", \"Scope\")\n                        .WithMany(\"UserClaims\")\n                        .HasForeignKey(\"ScopeId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Scope\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", \"Scope\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"ScopeId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Scope\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"Claims\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"AllowedCorsOrigins\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientGrantType\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"AllowedGrantTypes\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"IdentityProviderRestrictions\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"PostLogoutRedirectUris\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"RedirectUris\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientScope\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"AllowedScopes\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientSecret\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"ClientSecrets\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", \"IdentityResource\")\n                        .WithMany(\"UserClaims\")\n                        .HasForeignKey(\"IdentityResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"IdentityResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", \"IdentityResource\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"IdentityResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"IdentityResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", b =>\n                {\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"Scopes\");\n\n                    b.Navigation(\"Secrets\");\n\n                    b.Navigation(\"UserClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", b =>\n                {\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"UserClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.Client\", b =>\n                {\n                    b.Navigation(\"AllowedCorsOrigins\");\n\n                    b.Navigation(\"AllowedGrantTypes\");\n\n                    b.Navigation(\"AllowedScopes\");\n\n                    b.Navigation(\"Claims\");\n\n                    b.Navigation(\"ClientSecrets\");\n\n                    b.Navigation(\"IdentityProviderRestrictions\");\n\n                    b.Navigation(\"PostLogoutRedirectUris\");\n\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"RedirectUris\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", b =>\n                {\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"UserClaims\");\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/ConfigurationDb/20210828204649_InitialIdentityServerMigration.cs",
    "content": "﻿using System;\nusing Microsoft.EntityFrameworkCore.Migrations;\n\nnamespace IdentityProvider.Migrations.ConfigurationDb\n{\n    public partial class InitialIdentityServerMigration : Migration\n    {\n        protected override void Up(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.CreateTable(\n                name: \"ApiResources\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Enabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    Name = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    DisplayName = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    Description = table.Column<string>(type: \"nvarchar(1000)\", maxLength: 1000, nullable: true),\n                    AllowedAccessTokenSigningAlgorithms = table.Column<string>(type: \"nvarchar(100)\", maxLength: 100, nullable: true),\n                    ShowInDiscoveryDocument = table.Column<bool>(type: \"bit\", nullable: false),\n                    RequireResourceIndicator = table.Column<bool>(type: \"bit\", nullable: false),\n                    Created = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Updated = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    LastAccessed = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    NonEditable = table.Column<bool>(type: \"bit\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiResources\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiScopes\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Enabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    Name = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    DisplayName = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    Description = table.Column<string>(type: \"nvarchar(1000)\", maxLength: 1000, nullable: true),\n                    Required = table.Column<bool>(type: \"bit\", nullable: false),\n                    Emphasize = table.Column<bool>(type: \"bit\", nullable: false),\n                    ShowInDiscoveryDocument = table.Column<bool>(type: \"bit\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiScopes\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"Clients\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Enabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    ClientId = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    ProtocolType = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    RequireClientSecret = table.Column<bool>(type: \"bit\", nullable: false),\n                    ClientName = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    Description = table.Column<string>(type: \"nvarchar(1000)\", maxLength: 1000, nullable: true),\n                    ClientUri = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: true),\n                    LogoUri = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: true),\n                    RequireConsent = table.Column<bool>(type: \"bit\", nullable: false),\n                    AllowRememberConsent = table.Column<bool>(type: \"bit\", nullable: false),\n                    AlwaysIncludeUserClaimsInIdToken = table.Column<bool>(type: \"bit\", nullable: false),\n                    RequirePkce = table.Column<bool>(type: \"bit\", nullable: false),\n                    AllowPlainTextPkce = table.Column<bool>(type: \"bit\", nullable: false),\n                    RequireRequestObject = table.Column<bool>(type: \"bit\", nullable: false),\n                    AllowAccessTokensViaBrowser = table.Column<bool>(type: \"bit\", nullable: false),\n                    FrontChannelLogoutUri = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: true),\n                    FrontChannelLogoutSessionRequired = table.Column<bool>(type: \"bit\", nullable: false),\n                    BackChannelLogoutUri = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: true),\n                    BackChannelLogoutSessionRequired = table.Column<bool>(type: \"bit\", nullable: false),\n                    AllowOfflineAccess = table.Column<bool>(type: \"bit\", nullable: false),\n                    IdentityTokenLifetime = table.Column<int>(type: \"int\", nullable: false),\n                    AllowedIdentityTokenSigningAlgorithms = table.Column<string>(type: \"nvarchar(100)\", maxLength: 100, nullable: true),\n                    AccessTokenLifetime = table.Column<int>(type: \"int\", nullable: false),\n                    AuthorizationCodeLifetime = table.Column<int>(type: \"int\", nullable: false),\n                    ConsentLifetime = table.Column<int>(type: \"int\", nullable: true),\n                    AbsoluteRefreshTokenLifetime = table.Column<int>(type: \"int\", nullable: false),\n                    SlidingRefreshTokenLifetime = table.Column<int>(type: \"int\", nullable: false),\n                    RefreshTokenUsage = table.Column<int>(type: \"int\", nullable: false),\n                    UpdateAccessTokenClaimsOnRefresh = table.Column<bool>(type: \"bit\", nullable: false),\n                    RefreshTokenExpiration = table.Column<int>(type: \"int\", nullable: false),\n                    AccessTokenType = table.Column<int>(type: \"int\", nullable: false),\n                    EnableLocalLogin = table.Column<bool>(type: \"bit\", nullable: false),\n                    IncludeJwtId = table.Column<bool>(type: \"bit\", nullable: false),\n                    AlwaysSendClientClaims = table.Column<bool>(type: \"bit\", nullable: false),\n                    ClientClaimsPrefix = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    PairWiseSubjectSalt = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    Created = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Updated = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    LastAccessed = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    UserSsoLifetime = table.Column<int>(type: \"int\", nullable: true),\n                    UserCodeType = table.Column<string>(type: \"nvarchar(100)\", maxLength: 100, nullable: true),\n                    DeviceCodeLifetime = table.Column<int>(type: \"int\", nullable: false),\n                    NonEditable = table.Column<bool>(type: \"bit\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_Clients\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"IdentityProviders\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Scheme = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    DisplayName = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    Enabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    Type = table.Column<string>(type: \"nvarchar(20)\", maxLength: 20, nullable: false),\n                    Properties = table.Column<string>(type: \"nvarchar(max)\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_IdentityProviders\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"IdentityResources\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Enabled = table.Column<bool>(type: \"bit\", nullable: false),\n                    Name = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    DisplayName = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: true),\n                    Description = table.Column<string>(type: \"nvarchar(1000)\", maxLength: 1000, nullable: true),\n                    Required = table.Column<bool>(type: \"bit\", nullable: false),\n                    Emphasize = table.Column<bool>(type: \"bit\", nullable: false),\n                    ShowInDiscoveryDocument = table.Column<bool>(type: \"bit\", nullable: false),\n                    Created = table.Column<DateTime>(type: \"datetime2\", nullable: false),\n                    Updated = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    NonEditable = table.Column<bool>(type: \"bit\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_IdentityResources\", x => x.Id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiResourceClaims\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ApiResourceId = table.Column<int>(type: \"int\", nullable: false),\n                    Type = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiResourceClaims\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ApiResourceClaims_ApiResources_ApiResourceId\",\n                        column: x => x.ApiResourceId,\n                        principalTable: \"ApiResources\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiResourceProperties\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ApiResourceId = table.Column<int>(type: \"int\", nullable: false),\n                    Key = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Value = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiResourceProperties\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ApiResourceProperties_ApiResources_ApiResourceId\",\n                        column: x => x.ApiResourceId,\n                        principalTable: \"ApiResources\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiResourceScopes\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Scope = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    ApiResourceId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiResourceScopes\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ApiResourceScopes_ApiResources_ApiResourceId\",\n                        column: x => x.ApiResourceId,\n                        principalTable: \"ApiResources\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiResourceSecrets\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ApiResourceId = table.Column<int>(type: \"int\", nullable: false),\n                    Description = table.Column<string>(type: \"nvarchar(1000)\", maxLength: 1000, nullable: true),\n                    Value = table.Column<string>(type: \"nvarchar(4000)\", maxLength: 4000, nullable: false),\n                    Expiration = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    Type = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Created = table.Column<DateTime>(type: \"datetime2\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiResourceSecrets\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ApiResourceSecrets_ApiResources_ApiResourceId\",\n                        column: x => x.ApiResourceId,\n                        principalTable: \"ApiResources\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiScopeClaims\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ScopeId = table.Column<int>(type: \"int\", nullable: false),\n                    Type = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiScopeClaims\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ApiScopeClaims_ApiScopes_ScopeId\",\n                        column: x => x.ScopeId,\n                        principalTable: \"ApiScopes\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ApiScopeProperties\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ScopeId = table.Column<int>(type: \"int\", nullable: false),\n                    Key = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Value = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ApiScopeProperties\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ApiScopeProperties_ApiScopes_ScopeId\",\n                        column: x => x.ScopeId,\n                        principalTable: \"ApiScopes\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientClaims\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Type = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Value = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientClaims\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientClaims_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientCorsOrigins\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Origin = table.Column<string>(type: \"nvarchar(150)\", maxLength: 150, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientCorsOrigins\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientCorsOrigins_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientGrantTypes\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    GrantType = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientGrantTypes\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientGrantTypes_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientIdPRestrictions\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Provider = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientIdPRestrictions\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientIdPRestrictions_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientPostLogoutRedirectUris\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    PostLogoutRedirectUri = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientPostLogoutRedirectUris\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientPostLogoutRedirectUris_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientProperties\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false),\n                    Key = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Value = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientProperties\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientProperties_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientRedirectUris\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    RedirectUri = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientRedirectUris\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientRedirectUris_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientScopes\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    Scope = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientScopes\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientScopes_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"ClientSecrets\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    ClientId = table.Column<int>(type: \"int\", nullable: false),\n                    Description = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: true),\n                    Value = table.Column<string>(type: \"nvarchar(4000)\", maxLength: 4000, nullable: false),\n                    Expiration = table.Column<DateTime>(type: \"datetime2\", nullable: true),\n                    Type = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Created = table.Column<DateTime>(type: \"datetime2\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_ClientSecrets\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_ClientSecrets_Clients_ClientId\",\n                        column: x => x.ClientId,\n                        principalTable: \"Clients\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"IdentityResourceClaims\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    IdentityResourceId = table.Column<int>(type: \"int\", nullable: false),\n                    Type = table.Column<string>(type: \"nvarchar(200)\", maxLength: 200, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_IdentityResourceClaims\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_IdentityResourceClaims_IdentityResources_IdentityResourceId\",\n                        column: x => x.IdentityResourceId,\n                        principalTable: \"IdentityResources\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"IdentityResourceProperties\",\n                columns: table => new\n                {\n                    Id = table.Column<int>(type: \"int\", nullable: false)\n                        .Annotation(\"SqlServer:Identity\", \"1, 1\"),\n                    IdentityResourceId = table.Column<int>(type: \"int\", nullable: false),\n                    Key = table.Column<string>(type: \"nvarchar(250)\", maxLength: 250, nullable: false),\n                    Value = table.Column<string>(type: \"nvarchar(2000)\", maxLength: 2000, nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"PK_IdentityResourceProperties\", x => x.Id);\n                    table.ForeignKey(\n                        name: \"FK_IdentityResourceProperties_IdentityResources_IdentityResourceId\",\n                        column: x => x.IdentityResourceId,\n                        principalTable: \"IdentityResources\",\n                        principalColumn: \"Id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiResourceClaims_ApiResourceId\",\n                table: \"ApiResourceClaims\",\n                column: \"ApiResourceId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiResourceProperties_ApiResourceId\",\n                table: \"ApiResourceProperties\",\n                column: \"ApiResourceId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiResources_Name\",\n                table: \"ApiResources\",\n                column: \"Name\",\n                unique: true);\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiResourceScopes_ApiResourceId\",\n                table: \"ApiResourceScopes\",\n                column: \"ApiResourceId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiResourceSecrets_ApiResourceId\",\n                table: \"ApiResourceSecrets\",\n                column: \"ApiResourceId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiScopeClaims_ScopeId\",\n                table: \"ApiScopeClaims\",\n                column: \"ScopeId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiScopeProperties_ScopeId\",\n                table: \"ApiScopeProperties\",\n                column: \"ScopeId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ApiScopes_Name\",\n                table: \"ApiScopes\",\n                column: \"Name\",\n                unique: true);\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientClaims_ClientId\",\n                table: \"ClientClaims\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientCorsOrigins_ClientId\",\n                table: \"ClientCorsOrigins\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientGrantTypes_ClientId\",\n                table: \"ClientGrantTypes\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientIdPRestrictions_ClientId\",\n                table: \"ClientIdPRestrictions\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientPostLogoutRedirectUris_ClientId\",\n                table: \"ClientPostLogoutRedirectUris\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientProperties_ClientId\",\n                table: \"ClientProperties\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientRedirectUris_ClientId\",\n                table: \"ClientRedirectUris\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_Clients_ClientId\",\n                table: \"Clients\",\n                column: \"ClientId\",\n                unique: true);\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientScopes_ClientId\",\n                table: \"ClientScopes\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_ClientSecrets_ClientId\",\n                table: \"ClientSecrets\",\n                column: \"ClientId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_IdentityResourceClaims_IdentityResourceId\",\n                table: \"IdentityResourceClaims\",\n                column: \"IdentityResourceId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_IdentityResourceProperties_IdentityResourceId\",\n                table: \"IdentityResourceProperties\",\n                column: \"IdentityResourceId\");\n\n            migrationBuilder.CreateIndex(\n                name: \"IX_IdentityResources_Name\",\n                table: \"IdentityResources\",\n                column: \"Name\",\n                unique: true);\n        }\n\n        protected override void Down(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.DropTable(\n                name: \"ApiResourceClaims\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiResourceProperties\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiResourceScopes\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiResourceSecrets\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiScopeClaims\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiScopeProperties\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientClaims\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientCorsOrigins\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientGrantTypes\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientIdPRestrictions\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientPostLogoutRedirectUris\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientProperties\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientRedirectUris\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientScopes\");\n\n            migrationBuilder.DropTable(\n                name: \"ClientSecrets\");\n\n            migrationBuilder.DropTable(\n                name: \"IdentityProviders\");\n\n            migrationBuilder.DropTable(\n                name: \"IdentityResourceClaims\");\n\n            migrationBuilder.DropTable(\n                name: \"IdentityResourceProperties\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiResources\");\n\n            migrationBuilder.DropTable(\n                name: \"ApiScopes\");\n\n            migrationBuilder.DropTable(\n                name: \"Clients\");\n\n            migrationBuilder.DropTable(\n                name: \"IdentityResources\");\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/ConfigurationDb/ConfigurationDbContextModelSnapshot.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing Duende.IdentityServer.EntityFramework.DbContexts;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnamespace IdentityProvider.Migrations.ConfigurationDb\n{\n    [DbContext(typeof(ConfigurationDbContext))]\n    partial class ConfigurationDbContextModelSnapshot : ModelSnapshot\n    {\n        protected override void BuildModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 128)\n                .HasAnnotation(\"ProductVersion\", \"5.0.9\")\n                .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"AllowedAccessTokenSigningAlgorithms\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"LastAccessed\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Name\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"NonEditable\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequireResourceIndicator\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"ShowInDiscoveryDocument\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"Updated\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Name\")\n                        .IsUnique();\n\n                    b.ToTable(\"ApiResources\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Scope\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceScopes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ApiResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(4000)\n                        .HasColumnType(\"nvarchar(4000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ApiResourceId\");\n\n                    b.ToTable(\"ApiResourceSecrets\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Emphasize\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Name\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Required\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"ShowInDiscoveryDocument\")\n                        .HasColumnType(\"bit\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Name\")\n                        .IsUnique();\n\n                    b.ToTable(\"ApiScopes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ScopeId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ScopeId\");\n\n                    b.ToTable(\"ApiScopeClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<int>(\"ScopeId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ScopeId\");\n\n                    b.ToTable(\"ApiScopeProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.Client\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"AbsoluteRefreshTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<int>(\"AccessTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<int>(\"AccessTokenType\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"AllowAccessTokensViaBrowser\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AllowOfflineAccess\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AllowPlainTextPkce\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AllowRememberConsent\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"AllowedIdentityTokenSigningAlgorithms\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<bool>(\"AlwaysIncludeUserClaimsInIdToken\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"AlwaysSendClientClaims\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<int>(\"AuthorizationCodeLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"BackChannelLogoutSessionRequired\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"BackChannelLogoutUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<string>(\"ClientClaimsPrefix\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientId\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<int?>(\"ConsentLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<int>(\"DeviceCodeLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"EnableLocalLogin\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"FrontChannelLogoutSessionRequired\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"FrontChannelLogoutUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<int>(\"IdentityTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"IncludeJwtId\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"LastAccessed\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"LogoUri\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<bool>(\"NonEditable\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"PairWiseSubjectSalt\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ProtocolType\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<int>(\"RefreshTokenExpiration\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<int>(\"RefreshTokenUsage\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"RequireClientSecret\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequireConsent\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequirePkce\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"RequireRequestObject\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<int>(\"SlidingRefreshTokenLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<bool>(\"UpdateAccessTokenClaimsOnRefresh\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"Updated\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"UserCodeType\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<int?>(\"UserSsoLifetime\")\n                        .HasColumnType(\"int\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\")\n                        .IsUnique();\n\n                    b.ToTable(\"Clients\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Origin\")\n                        .IsRequired()\n                        .HasMaxLength(150)\n                        .HasColumnType(\"nvarchar(150)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientCorsOrigins\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientGrantType\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"GrantType\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientGrantTypes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Provider\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientIdPRestrictions\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"PostLogoutRedirectUri\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientPostLogoutRedirectUris\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"RedirectUri\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientRedirectUris\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientScope\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Scope\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientScopes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientSecret\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"ClientId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(4000)\n                        .HasColumnType(\"nvarchar(4000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"ClientId\");\n\n                    b.ToTable(\"ClientSecrets\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityProvider\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Properties\")\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Scheme\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(20)\n                        .HasColumnType(\"nvarchar(20)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.ToTable(\"IdentityProviders\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(1000)\n                        .HasColumnType(\"nvarchar(1000)\");\n\n                    b.Property<string>(\"DisplayName\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"Emphasize\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Enabled\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Name\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<bool>(\"NonEditable\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"Required\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"ShowInDiscoveryDocument\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<DateTime?>(\"Updated\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Name\")\n                        .IsUnique();\n\n                    b.ToTable(\"IdentityResources\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"IdentityResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"IdentityResourceId\");\n\n                    b.ToTable(\"IdentityResourceClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnType(\"int\")\n                        .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n                    b.Property<int>(\"IdentityResourceId\")\n                        .HasColumnType(\"int\");\n\n                    b.Property<string>(\"Key\")\n                        .IsRequired()\n                        .HasMaxLength(250)\n                        .HasColumnType(\"nvarchar(250)\");\n\n                    b.Property<string>(\"Value\")\n                        .IsRequired()\n                        .HasMaxLength(2000)\n                        .HasColumnType(\"nvarchar(2000)\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"IdentityResourceId\");\n\n                    b.ToTable(\"IdentityResourceProperties\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"UserClaims\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceScope\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"Scopes\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResourceSecret\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", \"ApiResource\")\n                        .WithMany(\"Secrets\")\n                        .HasForeignKey(\"ApiResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"ApiResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", \"Scope\")\n                        .WithMany(\"UserClaims\")\n                        .HasForeignKey(\"ScopeId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Scope\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScopeProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", \"Scope\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"ScopeId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Scope\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"Claims\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientCorsOrigin\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"AllowedCorsOrigins\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientGrantType\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"AllowedGrantTypes\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientIdPRestriction\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"IdentityProviderRestrictions\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientPostLogoutRedirectUri\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"PostLogoutRedirectUris\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientRedirectUri\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"RedirectUris\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientScope\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"AllowedScopes\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ClientSecret\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.Client\", \"Client\")\n                        .WithMany(\"ClientSecrets\")\n                        .HasForeignKey(\"ClientId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"Client\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceClaim\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", \"IdentityResource\")\n                        .WithMany(\"UserClaims\")\n                        .HasForeignKey(\"IdentityResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"IdentityResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResourceProperty\", b =>\n                {\n                    b.HasOne(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", \"IdentityResource\")\n                        .WithMany(\"Properties\")\n                        .HasForeignKey(\"IdentityResourceId\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.Navigation(\"IdentityResource\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiResource\", b =>\n                {\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"Scopes\");\n\n                    b.Navigation(\"Secrets\");\n\n                    b.Navigation(\"UserClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.ApiScope\", b =>\n                {\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"UserClaims\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.Client\", b =>\n                {\n                    b.Navigation(\"AllowedCorsOrigins\");\n\n                    b.Navigation(\"AllowedGrantTypes\");\n\n                    b.Navigation(\"AllowedScopes\");\n\n                    b.Navigation(\"Claims\");\n\n                    b.Navigation(\"ClientSecrets\");\n\n                    b.Navigation(\"IdentityProviderRestrictions\");\n\n                    b.Navigation(\"PostLogoutRedirectUris\");\n\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"RedirectUris\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.IdentityResource\", b =>\n                {\n                    b.Navigation(\"Properties\");\n\n                    b.Navigation(\"UserClaims\");\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Migrations/PersistedGrantDbContextModelSnapshot.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing Duende.IdentityServer.EntityFramework.DbContexts;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnamespace IdentityProvider.Migrations\n{\n    [DbContext(typeof(PersistedGrantDbContext))]\n    partial class PersistedGrantDbContextModelSnapshot : ModelSnapshot\n    {\n        protected override void BuildModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 128)\n                .HasAnnotation(\"ProductVersion\", \"5.0.9\")\n                .HasAnnotation(\"SqlServer:ValueGenerationStrategy\", SqlServerValueGenerationStrategy.IdentityColumn);\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.DeviceFlowCodes\", b =>\n                {\n                    b.Property<string>(\"UserCode\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientId\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime>(\"CreationTime\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Data\")\n                        .IsRequired()\n                        .HasMaxLength(50000)\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"DeviceCode\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .IsRequired()\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"SessionId\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<string>(\"SubjectId\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.HasKey(\"UserCode\");\n\n                    b.HasIndex(\"DeviceCode\")\n                        .IsUnique();\n\n                    b.HasIndex(\"Expiration\");\n\n                    b.ToTable(\"DeviceCodes\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.Key\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<string>(\"Algorithm\")\n                        .IsRequired()\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<DateTime>(\"Created\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Data\")\n                        .IsRequired()\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<bool>(\"DataProtected\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<bool>(\"IsX509Certificate\")\n                        .HasColumnType(\"bit\");\n\n                    b.Property<string>(\"Use\")\n                        .HasColumnType(\"nvarchar(450)\");\n\n                    b.Property<int>(\"Version\")\n                        .HasColumnType(\"int\");\n\n                    b.HasKey(\"Id\");\n\n                    b.HasIndex(\"Use\");\n\n                    b.ToTable(\"Keys\");\n                });\n\n            modelBuilder.Entity(\"Duende.IdentityServer.EntityFramework.Entities.PersistedGrant\", b =>\n                {\n                    b.Property<string>(\"Key\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"ClientId\")\n                        .IsRequired()\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime?>(\"ConsumedTime\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<DateTime>(\"CreationTime\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"Data\")\n                        .IsRequired()\n                        .HasMaxLength(50000)\n                        .HasColumnType(\"nvarchar(max)\");\n\n                    b.Property<string>(\"Description\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<DateTime?>(\"Expiration\")\n                        .HasColumnType(\"datetime2\");\n\n                    b.Property<string>(\"SessionId\")\n                        .HasMaxLength(100)\n                        .HasColumnType(\"nvarchar(100)\");\n\n                    b.Property<string>(\"SubjectId\")\n                        .HasMaxLength(200)\n                        .HasColumnType(\"nvarchar(200)\");\n\n                    b.Property<string>(\"Type\")\n                        .IsRequired()\n                        .HasMaxLength(50)\n                        .HasColumnType(\"nvarchar(50)\");\n\n                    b.HasKey(\"Key\");\n\n                    b.HasIndex(\"ConsumedTime\");\n\n                    b.HasIndex(\"Expiration\");\n\n                    b.HasIndex(\"SubjectId\", \"ClientId\", \"Type\");\n\n                    b.HasIndex(\"SubjectId\", \"SessionId\", \"Type\");\n\n                    b.ToTable(\"PersistedGrants\");\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Program.cs",
    "content": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace IdentityProvider\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateHostBuilder(args).Build().Run();\n        }\n\n        public static IHostBuilder CreateHostBuilder(string[] args) =>\n            Host.CreateDefaultBuilder(args)\n                .ConfigureWebHostDefaults(webBuilder =>\n                {\n                    webBuilder.UseStartup<Startup>();\n                });\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Properties/launchSettings.json",
    "content": "﻿{\n  \"profiles\": {\n    \"IdentityProvider\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/AccountController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing IdentityModel;\nusing Microsoft.AspNetCore.Authentication;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Duende.IdentityServer;\nusing Duende.IdentityServer.Events;\nusing Duende.IdentityServer.Extensions;\nusing Duende.IdentityServer.Models;\nusing Duende.IdentityServer.Services;\nusing Duende.IdentityServer.Stores;\nusing Microsoft.AspNetCore.Identity;\nusing SignInResult = Microsoft.AspNetCore.Identity.SignInResult;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    /// <summary>\n    /// This sample controller implements a typical login/logout/provision workflow for local and external accounts.\n    /// The login service encapsulates the interactions with the user data store. This data store is in-memory only and cannot be used for production!\n    /// The interaction service provides a way for the UI to communicate with identityserver for validation and context retrieval\n    /// </summary>\n    [SecurityHeaders]\n    [AllowAnonymous]\n    public class AccountController : Controller\n    {\n        private readonly IIdentityServerInteractionService _interaction;\n        private readonly IClientStore _clientStore;\n        private readonly IAuthenticationSchemeProvider _schemeProvider;\n        private readonly IIdentityProviderStore _identityProviderStore;\n        private readonly IEventService _events;\n        private readonly SignInManager<IdentityUser> _signInManager;\n\n        public AccountController(\n            IIdentityServerInteractionService interaction,\n            IClientStore clientStore,\n            IAuthenticationSchemeProvider schemeProvider,\n            IIdentityProviderStore identityProviderStore,\n            IEventService events,\n            SignInManager<IdentityUser> signInManager)\n        {\n            _interaction = interaction;\n            _clientStore = clientStore;\n            _schemeProvider = schemeProvider;\n            _identityProviderStore = identityProviderStore;\n            _events = events;\n\n            _signInManager = signInManager;\n        }\n\n        /// <summary>\n        /// Entry point into the login workflow\n        /// </summary>\n        [HttpGet]\n        public async Task<IActionResult> Login(string returnUrl)\n        {\n            // build a model so we know what to show on the login page\n            var vm = await BuildLoginViewModelAsync(returnUrl);\n\n            if (vm.IsExternalLoginOnly)\n            {\n                // we only have one option for logging in and it's an external provider\n                return RedirectToAction(\"Challenge\", \"External\", new { scheme = vm.ExternalLoginScheme, returnUrl });\n            }\n\n            return View(vm);\n        }\n\n        /// <summary>\n        /// Handle postback from username/password login\n        /// </summary>\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<IActionResult> Login(LoginInputModel model, string button)\n        {\n            // check if we are in the context of an authorization request\n            var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);\n\n            // the user clicked the \"cancel\" button\n            if (button != \"login\")\n            {\n                if (context != null)\n                {\n                    // if the user cancels, send a result back into IdentityServer as if they \n                    // denied the consent (even if this client does not require consent).\n                    // this will send back an access denied OIDC error response to the client.\n                    await _interaction.DenyAuthorizationAsync(context, AuthorizationError.AccessDenied);\n\n                    // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null\n                    if (context.IsNativeClient())\n                    {\n                        // The client is native, so this change in how to\n                        // return the response is for better UX for the end user.\n                        return this.LoadingPage(\"Redirect\", model.ReturnUrl);\n                    }\n\n                    return Redirect(model.ReturnUrl);\n                }\n                else\n                {\n                    // since we don't have a valid context, then we just go back to the home page\n                    return Redirect(\"~/\");\n                }\n            }\n\n            if (ModelState.IsValid)\n            {\n                // find user by username\n                var user = await _signInManager.UserManager.FindByNameAsync(model.Username);\n\n                // validate username/password using ASP.NET Identity\n                if (user != null && (await _signInManager.CheckPasswordSignInAsync(user, model.Password, true)) == SignInResult.Success)\n                {\n                    await _events.RaiseAsync(new UserLoginSuccessEvent(user.UserName, user.Id, user.UserName, clientId: context?.Client.ClientId));\n\n                    // only set explicit expiration here if user chooses \"remember me\". \n                    // otherwise we rely upon expiration configured in cookie middleware.\n                    AuthenticationProperties props = null;\n                    if (AccountOptions.AllowRememberLogin && model.RememberLogin)\n                    {\n                        props = new AuthenticationProperties\n                        {\n                            IsPersistent = true,\n                            ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)\n                        };\n                    };\n\n                    // issue authentication cookie with subject ID and username\n                    var isuser = new IdentityServerUser(user.Id)\n                    {\n                        DisplayName = user.UserName\n                    };\n\n                    await HttpContext.SignInAsync(isuser, props);\n\n                    if (context != null)\n                    {\n                        if (context.IsNativeClient())\n                        {\n                            // The client is native, so this change in how to\n                            // return the response is for better UX for the end user.\n                            return this.LoadingPage(\"Redirect\", model.ReturnUrl);\n                        }\n\n                        // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null\n                        return Redirect(model.ReturnUrl);\n                    }\n\n                    // request for a local page\n                    if (Url.IsLocalUrl(model.ReturnUrl))\n                    {\n                        return Redirect(model.ReturnUrl);\n                    }\n                    else if (string.IsNullOrEmpty(model.ReturnUrl))\n                    {\n                        return Redirect(\"~/\");\n                    }\n                    else\n                    {\n                        // user might have clicked on a malicious link - should be logged\n                        throw new Exception(\"invalid return URL\");\n                    }\n                }\n\n                await _events.RaiseAsync(new UserLoginFailureEvent(model.Username, \"invalid credentials\", clientId:context?.Client.ClientId));\n                ModelState.AddModelError(string.Empty, AccountOptions.InvalidCredentialsErrorMessage);\n            }\n\n            // something went wrong, show form with error\n            var vm = await BuildLoginViewModelAsync(model);\n            return View(vm);\n        }\n\n        \n        /// <summary>\n        /// Show logout page\n        /// </summary>\n        [HttpGet]\n        public async Task<IActionResult> Logout(string logoutId)\n        {\n            // build a model so the logout page knows what to display\n            var vm = await BuildLogoutViewModelAsync(logoutId);\n\n            if (vm.ShowLogoutPrompt == false)\n            {\n                // if the request for logout was properly authenticated from IdentityServer, then\n                // we don't need to show the prompt and can just log the user out directly.\n                return await Logout(vm);\n            }\n\n            return View(vm);\n        }\n\n        /// <summary>\n        /// Handle logout page postback\n        /// </summary>\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<IActionResult> Logout(LogoutInputModel model)\n        {\n            // build a model so the logged out page knows what to display\n            var vm = await BuildLoggedOutViewModelAsync(model.LogoutId);\n\n            if (User?.Identity.IsAuthenticated == true)\n            {\n                // delete local authentication cookie\n                await HttpContext.SignOutAsync();\n\n                // raise the logout event\n                await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));\n            }\n\n            // check if we need to trigger sign-out at an upstream identity provider\n            if (vm.TriggerExternalSignout)\n            {\n                // build a return URL so the upstream provider will redirect back\n                // to us after the user has logged out. this allows us to then\n                // complete our single sign-out processing.\n                string url = Url.Action(\"Logout\", new { logoutId = vm.LogoutId });\n\n                // this triggers a redirect to the external provider for sign-out\n                return SignOut(new AuthenticationProperties { RedirectUri = url }, vm.ExternalAuthenticationScheme);\n            }\n\n            return View(\"LoggedOut\", vm);\n        }\n\n        [HttpGet]\n        public IActionResult AccessDenied()\n        {\n            return View();\n        }\n\n\n        /*****************************************/\n        /* helper APIs for the AccountController */\n        /*****************************************/\n        private async Task<LoginViewModel> BuildLoginViewModelAsync(string returnUrl)\n        {\n            var context = await _interaction.GetAuthorizationContextAsync(returnUrl);\n            if (context?.IdP != null && await _schemeProvider.GetSchemeAsync(context.IdP) != null)\n            {\n                var local = context.IdP == Duende.IdentityServer.IdentityServerConstants.LocalIdentityProvider;\n\n                // this is meant to short circuit the UI and only trigger the one external IdP\n                var vm = new LoginViewModel\n                {\n                    EnableLocalLogin = local,\n                    ReturnUrl = returnUrl,\n                    Username = context?.LoginHint,\n                };\n\n                if (!local)\n                {\n                    vm.ExternalProviders = new[] { new ExternalProvider { AuthenticationScheme = context.IdP } };\n                }\n\n                return vm;\n            }\n\n            var schemes = await _schemeProvider.GetAllSchemesAsync();\n\n            var providers = schemes\n                .Where(x => x.DisplayName != null)\n                .Select(x => new ExternalProvider\n                {\n                    DisplayName = x.DisplayName ?? x.Name,\n                    AuthenticationScheme = x.Name\n                }).ToList();\n\n            var dyanmicSchemes = (await _identityProviderStore.GetAllSchemeNamesAsync())\n                .Where(x => x.Enabled)\n                .Select(x => new ExternalProvider\n                {\n                    AuthenticationScheme = x.Scheme,\n                    DisplayName = x.DisplayName\n                });\n            providers.AddRange(dyanmicSchemes);\n\n            var allowLocal = true;\n            if (context?.Client.ClientId != null)\n            {\n                var client = await _clientStore.FindEnabledClientByIdAsync(context.Client.ClientId);\n                if (client != null)\n                {\n                    allowLocal = client.EnableLocalLogin;\n\n                    if (client.IdentityProviderRestrictions != null && client.IdentityProviderRestrictions.Any())\n                    {\n                        providers = providers.Where(provider => client.IdentityProviderRestrictions.Contains(provider.AuthenticationScheme)).ToList();\n                    }\n                }\n            }\n\n            return new LoginViewModel\n            {\n                AllowRememberLogin = AccountOptions.AllowRememberLogin,\n                EnableLocalLogin = allowLocal && AccountOptions.AllowLocalLogin,\n                ReturnUrl = returnUrl,\n                Username = context?.LoginHint,\n                ExternalProviders = providers.ToArray()\n            };\n        }\n\n        private async Task<LoginViewModel> BuildLoginViewModelAsync(LoginInputModel model)\n        {\n            var vm = await BuildLoginViewModelAsync(model.ReturnUrl);\n            vm.Username = model.Username;\n            vm.RememberLogin = model.RememberLogin;\n            return vm;\n        }\n\n        private async Task<LogoutViewModel> BuildLogoutViewModelAsync(string logoutId)\n        {\n            var vm = new LogoutViewModel { LogoutId = logoutId, ShowLogoutPrompt = AccountOptions.ShowLogoutPrompt };\n\n            if (User?.Identity.IsAuthenticated != true)\n            {\n                // if the user is not authenticated, then just show logged out page\n                vm.ShowLogoutPrompt = false;\n                return vm;\n            }\n\n            var context = await _interaction.GetLogoutContextAsync(logoutId);\n            if (context?.ShowSignoutPrompt == false)\n            {\n                // it's safe to automatically sign-out\n                vm.ShowLogoutPrompt = false;\n                return vm;\n            }\n\n            // show the logout prompt. this prevents attacks where the user\n            // is automatically signed out by another malicious web page.\n            return vm;\n        }\n\n        private async Task<LoggedOutViewModel> BuildLoggedOutViewModelAsync(string logoutId)\n        {\n            // get context information (client name, post logout redirect URI and iframe for federated signout)\n            var logout = await _interaction.GetLogoutContextAsync(logoutId);\n\n            var vm = new LoggedOutViewModel\n            {\n                AutomaticRedirectAfterSignOut = AccountOptions.AutomaticRedirectAfterSignOut,\n                PostLogoutRedirectUri = logout?.PostLogoutRedirectUri,\n                ClientName = string.IsNullOrEmpty(logout?.ClientName) ? logout?.ClientId : logout?.ClientName,\n                SignOutIframeUrl = logout?.SignOutIFrameUrl,\n                LogoutId = logoutId\n            };\n\n            if (User?.Identity.IsAuthenticated == true)\n            {\n                var idp = User.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;\n                if (idp != null && idp != Duende.IdentityServer.IdentityServerConstants.LocalIdentityProvider)\n                {\n                    var providerSupportsSignout = await HttpContext.GetSchemeSupportsSignOutAsync(idp);\n                    if (providerSupportsSignout)\n                    {\n                        if (vm.LogoutId == null)\n                        {\n                            // if there's no current logout context, we need to create one\n                            // this captures necessary info from the current logged in user\n                            // before we signout and redirect away to the external IdP for signout\n                            vm.LogoutId = await _interaction.CreateLogoutContextAsync();\n                        }\n\n                        vm.ExternalAuthenticationScheme = idp;\n                    }\n                }\n            }\n\n            return vm;\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/AccountOptions.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class AccountOptions\n    {\n        public static bool AllowLocalLogin = true;\n        public static bool AllowRememberLogin = true;\n        public static TimeSpan RememberMeLoginDuration = TimeSpan.FromDays(30);\n\n        public static bool ShowLogoutPrompt = true;\n        public static bool AutomaticRedirectAfterSignOut = false;\n\n        public static string InvalidCredentialsErrorMessage = \"Invalid username or password\";\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/ExternalController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing IdentityModel;\nusing Microsoft.AspNetCore.Authentication;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Security.Claims;\nusing System.Threading.Tasks;\nusing Duende.IdentityServer;\nusing Duende.IdentityServer.Events;\nusing Duende.IdentityServer.Services;\nusing Duende.IdentityServer.Stores;\nusing Duende.IdentityServer.Test;\nusing Microsoft.AspNetCore.Identity;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    [SecurityHeaders]\n    [AllowAnonymous]\n    public class ExternalController : Controller\n    {\n        private readonly IIdentityServerInteractionService _interaction;\n        private readonly IClientStore _clientStore;\n        private readonly ILogger<ExternalController> _logger;\n        private readonly IEventService _events;\n        private readonly UserManager<IdentityUser> _userManager;\n\n        public ExternalController(\n            IIdentityServerInteractionService interaction,\n            IClientStore clientStore,\n            IEventService events,\n            ILogger<ExternalController> logger,\n            UserManager<IdentityUser> userManager)\n        {\n            _interaction = interaction;\n            _clientStore = clientStore;\n            _logger = logger;\n            _events = events;\n\n            _userManager = userManager;\n        }\n\n        /// <summary>\n        /// initiate roundtrip to external authentication provider\n        /// </summary>\n        [HttpGet]\n        public IActionResult Challenge(string scheme, string returnUrl)\n        {\n            if (string.IsNullOrEmpty(returnUrl)) returnUrl = \"~/\";\n\n            // validate returnUrl - either it is a valid OIDC URL or back to a local page\n            if (Url.IsLocalUrl(returnUrl) == false && _interaction.IsValidReturnUrl(returnUrl) == false)\n            {\n                // user might have clicked on a malicious link - should be logged\n                throw new Exception(\"invalid return URL\");\n            }\n            \n            // start challenge and roundtrip the return URL and scheme \n            var props = new AuthenticationProperties\n            {\n                RedirectUri = Url.Action(nameof(Callback)), \n                Items =\n                {\n                    { \"returnUrl\", returnUrl }, \n                    { \"scheme\", scheme },\n                }\n            };\n\n            return Challenge(props, scheme);\n        }\n\n        /// <summary>\n        /// Post processing of external authentication\n        /// </summary>\n        [HttpGet]\n        public async Task<IActionResult> Callback()\n        {\n            // read external identity from the temporary cookie\n            var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);\n            if (result?.Succeeded != true)\n            {\n                throw new Exception(\"External authentication error\");\n            }\n\n            if (_logger.IsEnabled(LogLevel.Debug))\n            {\n                var externalClaims = result.Principal.Claims.Select(c => $\"{c.Type}: {c.Value}\");\n                _logger.LogDebug(\"External claims: {@claims}\", externalClaims);\n            }\n\n            // lookup our user and external provider info\n            var (user, provider, providerUserId, claims) = await FindUserFromExternalProvider(result);\n            if (user == null)\n            {\n                // this might be where you might initiate a custom workflow for user registration\n                // in this sample we don't show how that would be done, as our sample implementation\n                // simply auto-provisions new external user\n                user = await AutoProvisionUser(provider, providerUserId, claims);\n            }\n\n            // this allows us to collect any additional claims or properties\n            // for the specific protocols used and store them in the local auth cookie.\n            // this is typically used to store data needed for signout from those protocols.\n            var additionalLocalClaims = new List<Claim>();\n            var localSignInProps = new AuthenticationProperties();\n            ProcessLoginCallback(result, additionalLocalClaims, localSignInProps);\n            \n            // issue authentication cookie for user\n            var isuser = new IdentityServerUser(user.Id)\n            {\n                DisplayName = user.UserName,\n                IdentityProvider = provider,\n                AdditionalClaims = additionalLocalClaims\n            };\n\n            await HttpContext.SignInAsync(isuser, localSignInProps);\n\n            // delete temporary cookie used during external authentication\n            await HttpContext.SignOutAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);\n\n            // retrieve return URL\n            var returnUrl = result.Properties.Items[\"returnUrl\"] ?? \"~/\";\n\n            // check if external login is in the context of an OIDC request\n            var context = await _interaction.GetAuthorizationContextAsync(returnUrl);\n            await _events.RaiseAsync(new UserLoginSuccessEvent(provider, providerUserId, user.Id, user.UserName, true, context?.Client.ClientId));\n\n            if (context != null)\n            {\n                if (context.IsNativeClient())\n                {\n                    // The client is native, so this change in how to\n                    // return the response is for better UX for the end user.\n                    return this.LoadingPage(\"Redirect\", returnUrl);\n                }\n            }\n\n            return Redirect(returnUrl);\n        }\n\n        private async Task<(IdentityUser user, string provider, string providerUserId, IEnumerable<Claim> claims)> FindUserFromExternalProvider(AuthenticateResult result)\n        {\n            var externalUser = result.Principal;\n\n            // try to determine the unique id of the external user (issued by the provider)\n            // the most common claim type for that are the sub claim and the NameIdentifier\n            // depending on the external provider, some other claim type might be used\n            var userIdClaim = externalUser.FindFirst(JwtClaimTypes.Subject) ??\n                              externalUser.FindFirst(ClaimTypes.NameIdentifier) ??\n                              throw new Exception(\"Unknown userid\");\n\n            // remove the user id claim so we don't include it as an extra claim if/when we provision the user\n            var claims = externalUser.Claims.ToList();\n            claims.Remove(userIdClaim);\n\n            var provider = result.Properties.Items[\"scheme\"];\n            var providerUserId = userIdClaim.Value;\n\n            // find external user\n            var user = await _userManager.FindByLoginAsync(provider, providerUserId);\n\n            return (user, provider, providerUserId, claims);\n        }\n\n        private async Task<IdentityUser> AutoProvisionUser(string provider, string providerUserId, IEnumerable<Claim> claims)\n        {\n            // create dummy internal account (you can do something more complex)\n            var user = new IdentityUser(Guid.NewGuid().ToString());\n            await _userManager.CreateAsync(user);\n\n            // add external user ID to new account\n            await _userManager.AddLoginAsync(user, new UserLoginInfo(provider, providerUserId, provider));\n            return user;\n        }\n\n        // if the external login is OIDC-based, there are certain things we need to preserve to make logout work\n        // this will be different for WS-Fed, SAML2p or other protocols\n        private void ProcessLoginCallback(AuthenticateResult externalResult, List<Claim> localClaims, AuthenticationProperties localSignInProps)\n        {\n            // if the external system sent a session id claim, copy it over\n            // so we can use it for single sign-out\n            var sid = externalResult.Principal.Claims.FirstOrDefault(x => x.Type == JwtClaimTypes.SessionId);\n            if (sid != null)\n            {\n                localClaims.Add(new Claim(JwtClaimTypes.SessionId, sid.Value));\n            }\n\n            // if the external provider issued an id_token, we'll keep it for signout\n            var idToken = externalResult.Properties.GetTokenValue(\"id_token\");\n            if (idToken != null)\n            {\n                localSignInProps.StoreTokens(new[] { new AuthenticationToken { Name = \"id_token\", Value = idToken } });\n            }\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/ExternalProvider.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ExternalProvider\n    {\n        public string DisplayName { get; set; }\n        public string AuthenticationScheme { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/LoggedOutViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class LoggedOutViewModel\n    {\n        public string PostLogoutRedirectUri { get; set; }\n        public string ClientName { get; set; }\n        public string SignOutIframeUrl { get; set; }\n\n        public bool AutomaticRedirectAfterSignOut { get; set; }\n\n        public string LogoutId { get; set; }\n        public bool TriggerExternalSignout => ExternalAuthenticationScheme != null;\n        public string ExternalAuthenticationScheme { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/LoginInputModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System.ComponentModel.DataAnnotations;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class LoginInputModel\n    {\n        [Required]\n        public string Username { get; set; }\n        [Required]\n        public string Password { get; set; }\n        public bool RememberLogin { get; set; }\n        public string ReturnUrl { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/LoginViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class LoginViewModel : LoginInputModel\n    {\n        public bool AllowRememberLogin { get; set; } = true;\n        public bool EnableLocalLogin { get; set; } = true;\n\n        public IEnumerable<ExternalProvider> ExternalProviders { get; set; } = Enumerable.Empty<ExternalProvider>();\n        public IEnumerable<ExternalProvider> VisibleExternalProviders => ExternalProviders.Where(x => !String.IsNullOrWhiteSpace(x.DisplayName));\n\n        public bool IsExternalLoginOnly => EnableLocalLogin == false && ExternalProviders?.Count() == 1;\n        public string ExternalLoginScheme => IsExternalLoginOnly ? ExternalProviders?.SingleOrDefault()?.AuthenticationScheme : null;\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/LogoutInputModel.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class LogoutInputModel\n    {\n        public string LogoutId { get; set; }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/LogoutViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class LogoutViewModel : LogoutInputModel\n    {\n        public bool ShowLogoutPrompt { get; set; } = true;\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Account/RedirectViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class RedirectViewModel\n    {\n        public string RedirectUrl { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ConsentController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Collections.Generic;\nusing System;\nusing Duende.IdentityServer.Events;\nusing Duende.IdentityServer.Extensions;\nusing Duende.IdentityServer.Models;\nusing Duende.IdentityServer.Services;\nusing Duende.IdentityServer.Validation;\nusing IdentityModel;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    /// <summary>\n    /// This controller processes the consent UI\n    /// </summary>\n    [SecurityHeaders]\n    [Authorize]\n    public class ConsentController : Controller\n    {\n        private readonly IIdentityServerInteractionService _interaction;\n        private readonly IEventService _events;\n        private readonly ILogger<ConsentController> _logger;\n\n        public ConsentController(\n            IIdentityServerInteractionService interaction,\n            IEventService events,\n            ILogger<ConsentController> logger)\n        {\n            _interaction = interaction;\n            _events = events;\n            _logger = logger;\n        }\n\n        /// <summary>\n        /// Shows the consent screen\n        /// </summary>\n        /// <param name=\"returnUrl\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> Index(string returnUrl)\n        {\n            var vm = await BuildViewModelAsync(returnUrl);\n            if (vm != null)\n            {\n                return View(\"Index\", vm);\n            }\n\n            return View(\"Error\");\n        }\n\n        /// <summary>\n        /// Handles the consent screen postback\n        /// </summary>\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<IActionResult> Index(ConsentInputModel model)\n        {\n            var result = await ProcessConsent(model);\n\n            if (result.IsRedirect)\n            {\n                var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);\n                if (context?.IsNativeClient() == true)\n                {\n                    // The client is native, so this change in how to\n                    // return the response is for better UX for the end user.\n                    return this.LoadingPage(\"Redirect\", result.RedirectUri);\n                }\n\n                return Redirect(result.RedirectUri);\n            }\n\n            if (result.HasValidationError)\n            {\n                ModelState.AddModelError(string.Empty, result.ValidationError);\n            }\n\n            if (result.ShowView)\n            {\n                return View(\"Index\", result.ViewModel);\n            }\n\n            return View(\"Error\");\n        }\n\n        /*****************************************/\n        /* helper APIs for the ConsentController */\n        /*****************************************/\n        private async Task<ProcessConsentResult> ProcessConsent(ConsentInputModel model)\n        {\n            var result = new ProcessConsentResult();\n\n            // validate return url is still valid\n            var request = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);\n            if (request == null) return result;\n\n            ConsentResponse grantedConsent = null;\n\n            // user clicked 'no' - send back the standard 'access_denied' response\n            if (model?.Button == \"no\")\n            {\n                grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied };\n\n                // emit event\n                await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues));\n            }\n            // user clicked 'yes' - validate the data\n            else if (model?.Button == \"yes\")\n            {\n                // if the user consented to some scope, build the response model\n                if (model.ScopesConsented != null && model.ScopesConsented.Any())\n                {\n                    var scopes = model.ScopesConsented;\n                    if (ConsentOptions.EnableOfflineAccess == false)\n                    {\n                        scopes = scopes.Where(x => x != Duende.IdentityServer.IdentityServerConstants.StandardScopes.OfflineAccess);\n                    }\n\n                    grantedConsent = new ConsentResponse\n                    {\n                        RememberConsent = model.RememberConsent,\n                        ScopesValuesConsented = scopes.ToArray(),\n                        Description = model.Description\n                    };\n\n                    // emit event\n                    await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent));\n                }\n                else\n                {\n                    result.ValidationError = ConsentOptions.MustChooseOneErrorMessage;\n                }\n            }\n            else\n            {\n                result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage;\n            }\n\n            if (grantedConsent != null)\n            {\n                // communicate outcome of consent back to identityserver\n                await _interaction.GrantConsentAsync(request, grantedConsent);\n\n                // indicate that's it ok to redirect back to authorization endpoint\n                result.RedirectUri = model.ReturnUrl;\n                result.Client = request.Client;\n            }\n            else\n            {\n                // we need to redisplay the consent UI\n                result.ViewModel = await BuildViewModelAsync(model.ReturnUrl, model);\n            }\n\n            return result;\n        }\n\n        private async Task<ConsentViewModel> BuildViewModelAsync(string returnUrl, ConsentInputModel model = null)\n        {\n            var request = await _interaction.GetAuthorizationContextAsync(returnUrl);\n            if (request != null)\n            {\n                return CreateConsentViewModel(model, returnUrl, request);\n            }\n            else\n            {\n                _logger.LogError(\"No consent request matching request: {0}\", returnUrl);\n            }\n\n            return null;\n        }\n\n        private ConsentViewModel CreateConsentViewModel(\n            ConsentInputModel model, string returnUrl,\n            AuthorizationRequest request)\n        {\n            var vm = new ConsentViewModel\n            {\n                RememberConsent = model?.RememberConsent ?? true,\n                ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty<string>(),\n                Description = model?.Description,\n\n                ReturnUrl = returnUrl,\n\n                ClientName = request.Client.ClientName ?? request.Client.ClientId,\n                ClientUrl = request.Client.ClientUri,\n                ClientLogoUrl = request.Client.LogoUri,\n                AllowRememberConsent = request.Client.AllowRememberConsent\n            };\n\n            vm.IdentityScopes = request.ValidatedResources.Resources.IdentityResources\n                .Select(x => CreateScopeViewModel(x, vm.ScopesConsented.Contains(x.Name) || model == null))\n                .ToArray();\n\n            var resourceIndicators = request.Parameters.GetValues(OidcConstants.AuthorizeRequest.Resource) ?? Enumerable.Empty<string>();\n            var apiResources = request.ValidatedResources.Resources.ApiResources.Where(x => resourceIndicators.Contains(x.Name));\n\n            var apiScopes = new List<ScopeViewModel>();\n            foreach (var parsedScope in request.ValidatedResources.ParsedScopes)\n            {\n                var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName);\n                if (apiScope != null)\n                {\n                    var scopeVm = CreateScopeViewModel(parsedScope, apiScope, vm.ScopesConsented.Contains(parsedScope.RawValue) || model == null);\n                    scopeVm.Resources = apiResources.Where(x => x.Scopes.Contains(parsedScope.ParsedName))\n                        .Select(x=> new ResourceViewModel\n                        {\n                            Name = x.Name,\n                            DisplayName = x.DisplayName ?? x.Name,\n                        }).ToArray();\n                    apiScopes.Add(scopeVm);\n                }\n            }\n            if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess)\n            {\n                apiScopes.Add(GetOfflineAccessScope(vm.ScopesConsented.Contains(Duende.IdentityServer.IdentityServerConstants.StandardScopes.OfflineAccess) || model == null));\n            }\n            vm.ApiScopes = apiScopes;\n\n            return vm;\n        }\n\n        private ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check)\n        {\n            return new ScopeViewModel\n            {\n                Name = identity.Name,\n                Value = identity.Name,\n                DisplayName = identity.DisplayName ?? identity.Name,\n                Description = identity.Description,\n                Emphasize = identity.Emphasize,\n                Required = identity.Required,\n                Checked = check || identity.Required\n            };\n        }\n\n        public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check)\n        {\n            var displayName = apiScope.DisplayName ?? apiScope.Name;\n            if (!String.IsNullOrWhiteSpace(parsedScopeValue.ParsedParameter))\n            {\n                displayName += \":\" + parsedScopeValue.ParsedParameter;\n            }\n\n            return new ScopeViewModel\n            {\n                Name = parsedScopeValue.ParsedName,\n                Value = parsedScopeValue.RawValue,\n                DisplayName = displayName,\n                Description = apiScope.Description,\n                Emphasize = apiScope.Emphasize,\n                Required = apiScope.Required,\n                Checked = check || apiScope.Required\n            };\n        }\n\n        private ScopeViewModel GetOfflineAccessScope(bool check)\n        {\n            return new ScopeViewModel\n            {\n                Value = Duende.IdentityServer.IdentityServerConstants.StandardScopes.OfflineAccess,\n                DisplayName = ConsentOptions.OfflineAccessDisplayName,\n                Description = ConsentOptions.OfflineAccessDescription,\n                Emphasize = true,\n                Checked = check\n            };\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ConsentInputModel.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System.Collections.Generic;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ConsentInputModel\n    {\n        public string Button { get; set; }\n        public IEnumerable<string> ScopesConsented { get; set; }\n        public bool RememberConsent { get; set; }\n        public string ReturnUrl { get; set; }\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ConsentOptions.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ConsentOptions\n    {\n        public static bool EnableOfflineAccess = true;\n        public static string OfflineAccessDisplayName = \"Offline Access\";\n        public static string OfflineAccessDescription = \"Access to your applications and resources, even when you are offline\";\n\n        public static readonly string MustChooseOneErrorMessage = \"You must pick at least one permission\";\n        public static readonly string InvalidSelectionErrorMessage = \"Invalid selection\";\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ConsentViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System.Collections.Generic;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ConsentViewModel : ConsentInputModel\n    {\n        public string ClientName { get; set; }\n        public string ClientUrl { get; set; }\n        public string ClientLogoUrl { get; set; }\n        public bool AllowRememberConsent { get; set; }\n\n        public IEnumerable<ScopeViewModel> IdentityScopes { get; set; }\n        public IEnumerable<ScopeViewModel> ApiScopes { get; set; }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ProcessConsentResult.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing Duende.IdentityServer.Models;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ProcessConsentResult\n    {\n        public bool IsRedirect => RedirectUri != null;\n        public string RedirectUri { get; set; }\n        public Client Client { get; set; }\n\n        public bool ShowView => ViewModel != null;\n        public ConsentViewModel ViewModel { get; set; }\n\n        public bool HasValidationError => ValidationError != null;\n        public string ValidationError { get; set; }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ResourceViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ResourceViewModel\n    {\n        public string Name { get; set; }\n        public string DisplayName { get; set; }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Consent/ScopeViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System.Collections.Generic;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ScopeViewModel\n    {\n        public string Name { get; set; }\n        public string Value { get; set; }\n        public string DisplayName { get; set; }\n        public string Description { get; set; }\n        public bool Emphasize { get; set; }\n        public bool Required { get; set; }\n        public bool Checked { get; set; }\n        public IEnumerable<ResourceViewModel> Resources { get; set; }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Device/DeviceAuthorizationInputModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class DeviceAuthorizationInputModel : ConsentInputModel\n    {\n        public string UserCode { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Device/DeviceAuthorizationViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class DeviceAuthorizationViewModel : ConsentViewModel\n    {\n        public string UserCode { get; set; }\n        public bool ConfirmUserCode { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Device/DeviceController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Duende.IdentityServer.Configuration;\nusing Duende.IdentityServer.Events;\nusing Duende.IdentityServer.Extensions;\nusing Duende.IdentityServer.Models;\nusing Duende.IdentityServer.Services;\nusing Duende.IdentityServer.Validation;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    [Authorize]\n    [SecurityHeaders]\n    public class DeviceController : Controller\n    {\n        private readonly IDeviceFlowInteractionService _interaction;\n        private readonly IEventService _events;\n        private readonly IOptions<IdentityServerOptions> _options;\n        private readonly ILogger<DeviceController> _logger;\n\n        public DeviceController(\n            IDeviceFlowInteractionService interaction,\n            IEventService eventService,\n            IOptions<IdentityServerOptions> options,\n            ILogger<DeviceController> logger)\n        {\n            _interaction = interaction;\n            _events = eventService;\n            _options = options;\n            _logger = logger;\n        }\n\n        [HttpGet]\n        public async Task<IActionResult> Index()\n        {\n            string userCodeParamName = _options.Value.UserInteraction.DeviceVerificationUserCodeParameter;\n            string userCode = Request.Query[userCodeParamName];\n            if (string.IsNullOrWhiteSpace(userCode)) return View(\"UserCodeCapture\");\n\n            var vm = await BuildViewModelAsync(userCode);\n            if (vm == null) return View(\"Error\");\n\n            vm.ConfirmUserCode = true;\n            return View(\"UserCodeConfirmation\", vm);\n        }\n\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<IActionResult> UserCodeCapture(string userCode)\n        {\n            var vm = await BuildViewModelAsync(userCode);\n            if (vm == null) return View(\"Error\");\n\n            return View(\"UserCodeConfirmation\", vm);\n        }\n\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<IActionResult> Callback(DeviceAuthorizationInputModel model)\n        {\n            if (model == null) throw new ArgumentNullException(nameof(model));\n\n            var result = await ProcessConsent(model);\n            if (result.HasValidationError) return View(\"Error\");\n\n            return View(\"Success\");\n        }\n\n        private async Task<ProcessConsentResult> ProcessConsent(DeviceAuthorizationInputModel model)\n        {\n            var result = new ProcessConsentResult();\n\n            var request = await _interaction.GetAuthorizationContextAsync(model.UserCode);\n            if (request == null) return result;\n\n            ConsentResponse grantedConsent = null;\n\n            // user clicked 'no' - send back the standard 'access_denied' response\n            if (model.Button == \"no\")\n            {\n                grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied };\n\n                // emit event\n                await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues));\n            }\n            // user clicked 'yes' - validate the data\n            else if (model.Button == \"yes\")\n            {\n                // if the user consented to some scope, build the response model\n                if (model.ScopesConsented != null && model.ScopesConsented.Any())\n                {\n                    var scopes = model.ScopesConsented;\n                    if (ConsentOptions.EnableOfflineAccess == false)\n                    {\n                        scopes = scopes.Where(x => x != Duende.IdentityServer.IdentityServerConstants.StandardScopes.OfflineAccess);\n                    }\n\n                    grantedConsent = new ConsentResponse\n                    {\n                        RememberConsent = model.RememberConsent,\n                        ScopesValuesConsented = scopes.ToArray(),\n                        Description = model.Description\n                    };\n\n                    // emit event\n                    await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent));\n                }\n                else\n                {\n                    result.ValidationError = ConsentOptions.MustChooseOneErrorMessage;\n                }\n            }\n            else\n            {\n                result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage;\n            }\n\n            if (grantedConsent != null)\n            {\n                // communicate outcome of consent back to identityserver\n                await _interaction.HandleRequestAsync(model.UserCode, grantedConsent);\n\n                // indicate that's it ok to redirect back to authorization endpoint\n                result.RedirectUri = model.ReturnUrl;\n                result.Client = request.Client;\n            }\n            else\n            {\n                // we need to redisplay the consent UI\n                result.ViewModel = await BuildViewModelAsync(model.UserCode, model);\n            }\n\n            return result;\n        }\n\n        private async Task<DeviceAuthorizationViewModel> BuildViewModelAsync(string userCode, DeviceAuthorizationInputModel model = null)\n        {\n            var request = await _interaction.GetAuthorizationContextAsync(userCode);\n            if (request != null)\n            {\n                return CreateConsentViewModel(userCode, model, request);\n            }\n\n            return null;\n        }\n\n        private DeviceAuthorizationViewModel CreateConsentViewModel(string userCode, DeviceAuthorizationInputModel model, DeviceFlowAuthorizationRequest request)\n        {\n            var vm = new DeviceAuthorizationViewModel\n            {\n                UserCode = userCode,\n                Description = model?.Description,\n\n                RememberConsent = model?.RememberConsent ?? true,\n                ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty<string>(),\n\n                ClientName = request.Client.ClientName ?? request.Client.ClientId,\n                ClientUrl = request.Client.ClientUri,\n                ClientLogoUrl = request.Client.LogoUri,\n                AllowRememberConsent = request.Client.AllowRememberConsent\n            };\n\n            vm.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => CreateScopeViewModel(x, vm.ScopesConsented.Contains(x.Name) || model == null)).ToArray();\n\n            var apiScopes = new List<ScopeViewModel>();\n            foreach (var parsedScope in request.ValidatedResources.ParsedScopes)\n            {\n                var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName);\n                if (apiScope != null)\n                {\n                    var scopeVm = CreateScopeViewModel(parsedScope, apiScope, vm.ScopesConsented.Contains(parsedScope.RawValue) || model == null);\n                    apiScopes.Add(scopeVm);\n                }\n            }\n            if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess)\n            {\n                apiScopes.Add(GetOfflineAccessScope(vm.ScopesConsented.Contains(Duende.IdentityServer.IdentityServerConstants.StandardScopes.OfflineAccess) || model == null));\n            }\n            vm.ApiScopes = apiScopes;\n\n            return vm;\n        }\n\n        private ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check)\n        {\n            return new ScopeViewModel\n            {\n                Value = identity.Name,\n                DisplayName = identity.DisplayName ?? identity.Name,\n                Description = identity.Description,\n                Emphasize = identity.Emphasize,\n                Required = identity.Required,\n                Checked = check || identity.Required\n            };\n        }\n\n        public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check)\n        {\n            return new ScopeViewModel\n            {\n                Value = parsedScopeValue.RawValue,\n                // todo: use the parsed scope value in the display?\n                DisplayName = apiScope.DisplayName ?? apiScope.Name,\n                Description = apiScope.Description,\n                Emphasize = apiScope.Emphasize,\n                Required = apiScope.Required,\n                Checked = check || apiScope.Required\n            };\n        }\n        private ScopeViewModel GetOfflineAccessScope(bool check)\n        {\n            return new ScopeViewModel\n            {\n                Value = Duende.IdentityServer.IdentityServerConstants.StandardScopes.OfflineAccess,\n                DisplayName = ConsentOptions.OfflineAccessDisplayName,\n                Description = ConsentOptions.OfflineAccessDescription,\n                Emphasize = true,\n                Checked = check\n            };\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Diagnostics/DiagnosticsController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Authentication;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    [SecurityHeaders]\n    [Authorize]\n    public class DiagnosticsController : Controller\n    {\n        public async Task<IActionResult> Index()\n        {\n            var localAddresses = new string[] { \"127.0.0.1\", \"::1\", HttpContext.Connection.LocalIpAddress.ToString() };\n            if (!localAddresses.Contains(HttpContext.Connection.RemoteIpAddress.ToString()))\n            {\n                return NotFound();\n            }\n\n            var model = new DiagnosticsViewModel(await HttpContext.AuthenticateAsync());\n            return View(model);\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Diagnostics/DiagnosticsViewModel.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing IdentityModel;\nusing Microsoft.AspNetCore.Authentication;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.Json;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class DiagnosticsViewModel\n    {\n        public DiagnosticsViewModel(AuthenticateResult result)\n        {\n            AuthenticateResult = result;\n\n            if (result.Properties.Items.ContainsKey(\"client_list\"))\n            {\n                var encoded = result.Properties.Items[\"client_list\"];\n                var bytes = Base64Url.Decode(encoded);\n                var value = Encoding.UTF8.GetString(bytes);\n\n                Clients = JsonSerializer.Deserialize<string[]>(value);\n            }\n        }\n\n        public AuthenticateResult AuthenticateResult { get; }\n        public IEnumerable<string> Clients { get; } = new List<string>();\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Extensions.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System;\nusing Duende.IdentityServer.Models;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public static class Extensions\n    {\n        /// <summary>\n        /// Checks if the redirect URI is for a native client.\n        /// </summary>\n        /// <returns></returns>\n        public static bool IsNativeClient(this AuthorizationRequest context)\n        {\n            return !context.RedirectUri.StartsWith(\"https\", StringComparison.Ordinal)\n               && !context.RedirectUri.StartsWith(\"http\", StringComparison.Ordinal);\n        }\n\n        public static IActionResult LoadingPage(this Controller controller, string viewName, string redirectUri)\n        {\n            controller.HttpContext.Response.StatusCode = 200;\n            controller.HttpContext.Response.Headers[\"Location\"] = \"\";\n            \n            return controller.View(viewName, new RedirectViewModel { RedirectUrl = redirectUri });\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/Grants/GrantsController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing Microsoft.AspNetCore.Mvc;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Duende.IdentityServer.Events;\nusing Duende.IdentityServer.Extensions;\nusing Duende.IdentityServer.Services;\nusing Duende.IdentityServer.Stores;\nusing Microsoft.AspNetCore.Authorization;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    /// <summary>\n    /// This sample controller allows a user to revoke grants given to clients\n    /// </summary>\n    [SecurityHeaders]\n    [Authorize]\n    public class GrantsController : Controller\n    {\n        private readonly IIdentityServerInteractionService _interaction;\n        private readonly IClientStore _clients;\n        private readonly IResourceStore _resources;\n        private readonly IEventService _events;\n\n        public GrantsController(IIdentityServerInteractionService interaction,\n            IClientStore clients,\n            IResourceStore resources,\n            IEventService events)\n        {\n            _interaction = interaction;\n            _clients = clients;\n            _resources = resources;\n            _events = events;\n        }\n\n        /// <summary>\n        /// Show list of grants\n        /// </summary>\n        [HttpGet]\n        public async Task<IActionResult> Index()\n        {\n            return View(\"Index\", await BuildViewModelAsync());\n        }\n\n        /// <summary>\n        /// Handle postback to revoke a client\n        /// </summary>\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<IActionResult> Revoke(string clientId)\n        {\n            await _interaction.RevokeUserConsentAsync(clientId);\n            await _events.RaiseAsync(new GrantsRevokedEvent(User.GetSubjectId(), clientId));\n\n            return RedirectToAction(\"Index\");\n        }\n\n        private async Task<GrantsViewModel> BuildViewModelAsync()\n        {\n            var grants = await _interaction.GetAllUserGrantsAsync();\n\n            var list = new List<GrantViewModel>();\n            foreach(var grant in grants)\n            {\n                var client = await _clients.FindClientByIdAsync(grant.ClientId);\n                if (client != null)\n                {\n                    var resources = await _resources.FindResourcesByScopeAsync(grant.Scopes);\n\n                    var item = new GrantViewModel()\n                    {\n                        ClientId = client.ClientId,\n                        ClientName = client.ClientName ?? client.ClientId,\n                        ClientLogoUrl = client.LogoUri,\n                        ClientUrl = client.ClientUri,\n                        Description = grant.Description,\n                        Created = grant.CreationTime,\n                        Expires = grant.Expiration,\n                        IdentityGrantNames = resources.IdentityResources.Select(x => x.DisplayName ?? x.Name).ToArray(),\n                        ApiGrantNames = resources.ApiScopes.Select(x => x.DisplayName ?? x.Name).ToArray()\n                    };\n\n                    list.Add(item);\n                }\n            }\n\n            return new GrantsViewModel\n            {\n                Grants = list\n            };\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Grants/GrantsViewModel.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class GrantsViewModel\n    {\n        public IEnumerable<GrantViewModel> Grants { get; set; }\n    }\n\n    public class GrantViewModel\n    {\n        public string ClientId { get; set; }\n        public string ClientName { get; set; }\n        public string ClientUrl { get; set; }\n        public string ClientLogoUrl { get; set; }\n        public string Description { get; set; }\n        public DateTime Created { get; set; }\n        public DateTime? Expires { get; set; }\n        public IEnumerable<string> IdentityGrantNames { get; set; }\n        public IEnumerable<string> ApiGrantNames { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Home/ErrorViewModel.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing Duende.IdentityServer.Models;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class ErrorViewModel\n    {\n        public ErrorViewModel()\n        {\n        }\n\n        public ErrorViewModel(string error)\n        {\n            Error = new ErrorMessage { Error = error };\n        }\n\n        public ErrorMessage Error { get; set; }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/Home/HomeController.cs",
    "content": "// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Hosting;\nusing Microsoft.Extensions.Logging;\nusing System.Threading.Tasks;\nusing Duende.IdentityServer.Services;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    [SecurityHeaders]\n    [AllowAnonymous]\n    public class HomeController : Controller\n    {\n        private readonly IIdentityServerInteractionService _interaction;\n        private readonly IWebHostEnvironment _environment;\n        private readonly ILogger _logger;\n\n        public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment, ILogger<HomeController> logger)\n        {\n            _interaction = interaction;\n            _environment = environment;\n            _logger = logger;\n        }\n\n        public IActionResult Index()\n        {\n            if (_environment.IsDevelopment())\n            {\n                // only show in development\n                return View();\n            }\n\n            _logger.LogInformation(\"Homepage is disabled in production. Returning 404.\");\n            return NotFound();\n        }\n\n        /// <summary>\n        /// Shows the error page\n        /// </summary>\n        public async Task<IActionResult> Error(string errorId)\n        {\n            var vm = new ErrorViewModel();\n\n            // retrieve error details from identityserver\n            var message = await _interaction.GetErrorContextAsync(errorId);\n            if (message != null)\n            {\n                vm.Error = message;\n\n                if (!_environment.IsDevelopment())\n                {\n                    // only show in development\n                    message.ErrorDescription = null;\n                }\n            }\n\n            return View(\"Error\", vm);\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Quickstart/SecurityHeadersAttribute.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.Filters;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class SecurityHeadersAttribute : ActionFilterAttribute\n    {\n        public override void OnResultExecuting(ResultExecutingContext context)\n        {\n            var result = context.Result;\n            if (result is ViewResult)\n            {\n                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options\n                if (!context.HttpContext.Response.Headers.ContainsKey(\"X-Content-Type-Options\"))\n                {\n                    context.HttpContext.Response.Headers.Add(\"X-Content-Type-Options\", \"nosniff\");\n                }\n\n                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options\n                if (!context.HttpContext.Response.Headers.ContainsKey(\"X-Frame-Options\"))\n                {\n                    context.HttpContext.Response.Headers.Add(\"X-Frame-Options\", \"SAMEORIGIN\");\n                }\n\n                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy\n                var csp = \"default-src 'self'; object-src 'none'; frame-ancestors 'none'; sandbox allow-forms allow-same-origin allow-scripts; base-uri 'self';\";\n                // also consider adding upgrade-insecure-requests once you have HTTPS in place for production\n                //csp += \"upgrade-insecure-requests;\";\n                // also an example if you need client images to be displayed from twitter\n                // csp += \"img-src 'self' https://pbs.twimg.com;\";\n\n                // once for standards compliant browsers\n                if (!context.HttpContext.Response.Headers.ContainsKey(\"Content-Security-Policy\"))\n                {\n                    context.HttpContext.Response.Headers.Add(\"Content-Security-Policy\", csp);\n                }\n                // and once again for IE\n                if (!context.HttpContext.Response.Headers.ContainsKey(\"X-Content-Security-Policy\"))\n                {\n                    context.HttpContext.Response.Headers.Add(\"X-Content-Security-Policy\", csp);\n                }\n\n                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy\n                var referrer_policy = \"no-referrer\";\n                if (!context.HttpContext.Response.Headers.ContainsKey(\"Referrer-Policy\"))\n                {\n                    context.HttpContext.Response.Headers.Add(\"Referrer-Policy\", referrer_policy);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Quickstart/TestUsers.cs",
    "content": "﻿// Copyright (c) Duende Software. All rights reserved.\n// See LICENSE in the project root for license information.\n\n\nusing IdentityModel;\nusing System.Collections.Generic;\nusing System.Security.Claims;\nusing System.Text.Json;\nusing Duende.IdentityServer;\nusing Duende.IdentityServer.Test;\n\nnamespace IdentityServerHost.Quickstart.UI\n{\n    public class TestUsers\n    {\n        public static List<TestUser> Users\n        {\n            get\n            {\n                var address = new\n                {\n                    street_address = \"One Hacker Way\",\n                    locality = \"Heidelberg\",\n                    postal_code = 69118,\n                    country = \"Germany\"\n                };\n                \n                return new List<TestUser>\n                {\n                    new TestUser\n                    {\n                        SubjectId = \"818727\",\n                        Username = \"alice\",\n                        Password = \"alice\",\n                        Claims =\n                        {\n                            new Claim(JwtClaimTypes.Name, \"Alice Smith\"),\n                            new Claim(JwtClaimTypes.GivenName, \"Alice\"),\n                            new Claim(JwtClaimTypes.FamilyName, \"Smith\"),\n                            new Claim(JwtClaimTypes.Email, \"AliceSmith@email.com\"),\n                            new Claim(JwtClaimTypes.EmailVerified, \"true\", ClaimValueTypes.Boolean),\n                            new Claim(JwtClaimTypes.WebSite, \"http://alice.com\"),\n                            new Claim(JwtClaimTypes.Address, JsonSerializer.Serialize(address), IdentityServerConstants.ClaimValueTypes.Json)\n                        }\n                    },\n                    new TestUser\n                    {\n                        SubjectId = \"88421113\",\n                        Username = \"bob\",\n                        Password = \"bob\",\n                        Claims =\n                        {\n                            new Claim(JwtClaimTypes.Name, \"Bob Smith\"),\n                            new Claim(JwtClaimTypes.GivenName, \"Bob\"),\n                            new Claim(JwtClaimTypes.FamilyName, \"Smith\"),\n                            new Claim(JwtClaimTypes.Email, \"BobSmith@email.com\"),\n                            new Claim(JwtClaimTypes.EmailVerified, \"true\", ClaimValueTypes.Boolean),\n                            new Claim(JwtClaimTypes.WebSite, \"http://bob.com\"),\n                            new Claim(JwtClaimTypes.Address, JsonSerializer.Serialize(address), IdentityServerConstants.ClaimValueTypes.Json)\n                        }\n                    }\n                };\n            }\n        }\n    }\n}"
  },
  {
    "path": "IdentityProvider/Startup.cs",
    "content": "using System.Linq;\nusing System.Reflection;\nusing Duende.IdentityServer.EntityFramework.DbContexts;\nusing Duende.IdentityServer.EntityFramework.Mappers;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Identity;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace IdentityProvider\n{\n    public class Startup\n    {\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddControllersWithViews();\n\n            // using local db (assumes Visual Studio has been installed)\n            const string connectionString = @\"Data Source=(LocalDb)\\MSSQLLocalDB;database=Test.IdentityServer.EntityFramework;trusted_connection=yes;\";\n            var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;\n\n            services.AddDbContext<ApplicationDbContext>(builder =>\n                builder.UseSqlServer(connectionString, sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly)));\n\n            services.AddIdentity<IdentityUser, IdentityRole>()\n                .AddEntityFrameworkStores<ApplicationDbContext>();\n\n            var identityServerBuilder = services.AddIdentityServer(options => options.KeyManagement.Enabled = true);\n            \n            /*identityServerBuilder.AddInMemoryClients(Clients.Get())\n                .AddInMemoryIdentityResources(Resources.GetIdentityResources())\n                .AddInMemoryApiResources(Resources.GetApiResources())\n                .AddInMemoryApiScopes(Resources.GetApiScopes());*/\n\n            identityServerBuilder.AddOperationalStore(options =>\n                    options.ConfigureDbContext = builder =>\n                        builder.UseSqlServer(connectionString, sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly)))\n                .AddConfigurationStore(options =>\n                    options.ConfigureDbContext = builder =>\n                        builder.UseSqlServer(connectionString, sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly)));\n\n            identityServerBuilder.AddAspNetIdentity<IdentityUser>();\n        }\n\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n        {\n            app.UseDeveloperExceptionPage();\n\n            InitializeDbTestData(app);\n            \n            app.UseStaticFiles();\n            app.UseRouting();\n\t\n            app.UseIdentityServer();\n            app.UseAuthorization();\n\n            app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());\n        }\n        \n        /// <summary>\n        /// A small bootstrapping method that will run EF migrations against the database\n        /// and create your test data.\n        /// </summary>\n        private static void InitializeDbTestData(IApplicationBuilder app)\n        {\n            using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())\n            {\n                serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();\n                serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>().Database.Migrate();\n                serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();\n\n                var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();\n\n                if (!context.Clients.Any())\n                {\n                    foreach (var client in Clients.Get())\n                    {\n                        context.Clients.Add(client.ToEntity());\n                    }\n                    context.SaveChanges();\n                }\n\n                if (!context.IdentityResources.Any())\n                {\n                    foreach (var resource in Resources.GetIdentityResources())\n                    {\n                        context.IdentityResources.Add(resource.ToEntity());\n                    }\n                    context.SaveChanges();\n                }\n\n                if (!context.ApiScopes.Any())\n                {\n                    foreach (var scope in Resources.GetApiScopes())\n                    {\n                        context.ApiScopes.Add(scope.ToEntity());\n                    }\n                    context.SaveChanges();\n                }\n\n                if (!context.ApiResources.Any())\n                {\n                    foreach (var resource in Resources.GetApiResources())\n                    {\n                        context.ApiResources.Add(resource.ToEntity());\n                    }\n                    context.SaveChanges();\n                }\n\n                var userManager = serviceScope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();\n                if (!userManager.Users.Any())\n                {\n                    foreach (var testUser in Users.Get())\n                    {\n                        var identityUser = new IdentityUser(testUser.Username)\n                        {\n                            Id = testUser.SubjectId\n                        };\n\n                        userManager.CreateAsync(identityUser, \"Password123!\").Wait();\n                        userManager.AddClaimsAsync(identityUser, testUser.Claims.ToList()).Wait();\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Views/Account/AccessDenied.cshtml",
    "content": "﻿\n<div class=\"container\">\n    <div class=\"lead\">\n        <h1>Access Denied</h1>\n        <p>You do not have access to that resource.</p>\n    </div>\n</div>"
  },
  {
    "path": "IdentityProvider/Views/Account/LoggedOut.cshtml",
    "content": "﻿@model LoggedOutViewModel\n\n@{ \n    // set this so the layout rendering sees an anonymous user\n    ViewData[\"signed-out\"] = true;\n}\n\n<div class=\"logged-out-page\">\n    <h1>\n        Logout\n        <small>You are now logged out</small>\n    </h1>\n\n    @if (Model.PostLogoutRedirectUri != null)\n    {\n        <div>\n            Click <a class=\"PostLogoutRedirectUri\" href=\"@Model.PostLogoutRedirectUri\">here</a> to return to the\n            <span>@Model.ClientName</span> application.\n        </div>\n    }\n\n    @if (Model.SignOutIframeUrl != null)\n    {\n        <iframe width=\"0\" height=\"0\" class=\"signout\" src=\"@Model.SignOutIframeUrl\"></iframe>\n    }\n</div>\n\n@section scripts\n{\n    @if (Model.AutomaticRedirectAfterSignOut)\n    {\n        <script src=\"~/js/signout-redirect.js\"></script>\n    }\n}\n"
  },
  {
    "path": "IdentityProvider/Views/Account/Login.cshtml",
    "content": "@model LoginViewModel\n\n<div class=\"login-page\">\n    <div class=\"lead\">\n        <h1>Login</h1>\n        <p>Choose how to login</p>\n    </div>\n\n    <partial name=\"_ValidationSummary\" />\n\n    <div class=\"row\">\n\n        @if (Model.EnableLocalLogin)\n        {\n            <div class=\"col-sm-6\">\n                <div class=\"card\">\n                    <div class=\"card-header\">\n                        <h2>Local Account</h2>\n                    </div>\n\n                    <div class=\"card-body\">\n                        <form asp-route=\"Login\">\n                            <input type=\"hidden\" asp-for=\"ReturnUrl\" />\n\n                            <div class=\"form-group\">\n                                <label asp-for=\"Username\"></label>\n                                <input class=\"form-control\" placeholder=\"Username\" asp-for=\"Username\" autofocus>\n                            </div>\n                            <div class=\"form-group\">\n                                <label asp-for=\"Password\"></label>\n                                <input type=\"password\" class=\"form-control\" placeholder=\"Password\" asp-for=\"Password\" autocomplete=\"off\">\n                            </div>\n                            @if (Model.AllowRememberLogin)\n                            {\n                                <div class=\"form-group\">\n                                    <div class=\"form-check\">\n                                        <input class=\"form-check-input\" asp-for=\"RememberLogin\">\n                                        <label class=\"form-check-label\" asp-for=\"RememberLogin\">\n                                            Remember My Login\n                                        </label>\n                                    </div>\n                                </div>\n                            }\n                            <button class=\"btn btn-primary\" name=\"button\" value=\"login\">Login</button>\n                            <button class=\"btn btn-secondary\" name=\"button\" value=\"cancel\">Cancel</button>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        }\n\n        @if (Model.VisibleExternalProviders.Any())\n        {\n            <div class=\"col-sm-6\">\n                <div class=\"card\">\n                    <div class=\"card-header\">\n                        <h2>External Account</h2>\n                    </div>\n                    <div class=\"card-body\">\n                        <ul class=\"list-inline\">\n                            @foreach (var provider in Model.VisibleExternalProviders)\n                            {\n                                <li class=\"list-inline-item\">\n                                    <a class=\"btn btn-secondary\"\n                                       asp-controller=\"External\"\n                                       asp-action=\"Challenge\"\n                                       asp-route-scheme=\"@provider.AuthenticationScheme\"\n                                       asp-route-returnUrl=\"@Model.ReturnUrl\">\n                                        @provider.DisplayName\n                                    </a>\n                                </li>\n                            }\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        }\n\n        @if (!Model.EnableLocalLogin && !Model.VisibleExternalProviders.Any())\n        {\n            <div class=\"alert alert-warning\">\n                <strong>Invalid login request</strong>\n                There are no login schemes configured for this request.\n            </div>\n        }\n    </div>\n</div>"
  },
  {
    "path": "IdentityProvider/Views/Account/Logout.cshtml",
    "content": "﻿@model LogoutViewModel\n\n<div class=\"logout-page\">\n    <div class=\"lead\">\n        <h1>Logout</h1>\n        <p>Would you like to logout of IdentityServer?</p>\n    </div>\n\n    <form asp-action=\"Logout\">\n        <input type=\"hidden\" name=\"logoutId\" value=\"@Model.LogoutId\"  />\n        <div class=\"form-group\">\n            <button class=\"btn btn-primary\">Yes</button>\n        </div>\n    </form>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Consent/Index.cshtml",
    "content": "@model ConsentViewModel\n\n<div class=\"page-consent\">\n    <div class=\"lead\">\n        @if (Model.ClientLogoUrl != null)\n        {\n            <div class=\"client-logo\"><img src=\"@Model.ClientLogoUrl\"></div>\n        }\n        <h1>\n            @Model.ClientName\n            <small class=\"text-muted\">is requesting your permission</small>\n        </h1>\n        <p>Uncheck the permissions you do not wish to grant.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-sm-8\">\n            <partial name=\"_ValidationSummary\" />\n        </div>\n    </div>\n\n    <form asp-action=\"Index\">\n        <input type=\"hidden\" asp-for=\"ReturnUrl\" />\n        <div class=\"row\">\n            <div class=\"col-sm-8\">\n                @if (Model.IdentityScopes.Any())\n                {\n                    <div class=\"form-group\">\n                        <div class=\"card\">\n                            <div class=\"card-header\">\n                                <span class=\"glyphicon glyphicon-user\"></span>\n                                Personal Information\n                            </div>\n                            <ul class=\"list-group list-group-flush\">\n                                @foreach (var scope in Model.IdentityScopes)\n                                {\n                                    <partial name=\"_ScopeListItem\" model=\"@scope\" />\n                                }\n                            </ul>\n                        </div>\n                    </div>\n                }\n\n                @if (Model.ApiScopes.Any())\n                {\n                    <div class=\"form-group\">\n                        <div class=\"card\">\n                            <div class=\"card-header\">\n                                <span class=\"glyphicon glyphicon-tasks\"></span>\n                                Application Access\n                            </div>\n                            <ul class=\"list-group list-group-flush\">\n                                @foreach (var scope in Model.ApiScopes)\n                                {\n                                    <partial name=\"_ScopeListItem\" model=\"scope\" />\n                                }\n                            </ul>\n                        </div>\n                    </div>\n                }\n                \n                <div class=\"form-group\">\n                    <div class=\"card\">\n                        <div class=\"card-header\">\n                            <span class=\"glyphicon glyphicon-pencil\"></span>\n                            Description\n                        </div>\n                        <div class=\"card-body\">\n                            <input class=\"form-control\" placeholder=\"Description or name of device\" asp-for=\"Description\" autofocus>\n                        </div>\n                    </div>\n                </div>\n\n                @if (Model.AllowRememberConsent)\n                {\n                    <div class=\"form-group\">\n                        <div class=\"form-check\">\n                            <input class=\"form-check-input\" asp-for=\"RememberConsent\">\n                            <label class=\"form-check-label\" asp-for=\"RememberConsent\">\n                                <strong>Remember My Decision</strong>\n                            </label>\n                        </div>\n                    </div>\n                }\n            </div>\n        </div>\n\n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <button name=\"button\" value=\"yes\" class=\"btn btn-primary\" autofocus>Yes, Allow</button>\n                <button name=\"button\" value=\"no\" class=\"btn btn-secondary\">No, Do Not Allow</button>\n            </div>\n            <div class=\"col-sm-4 col-lg-auto\">\n                @if (Model.ClientUrl != null)\n                {\n                    <a class=\"btn btn-outline-info\" href=\"@Model.ClientUrl\">\n                        <span class=\"glyphicon glyphicon-info-sign\"></span>\n                        <strong>@Model.ClientName</strong>\n                    </a>\n                }\n            </div>\n        </div>\n    </form>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Device/Success.cshtml",
    "content": "\n<div class=\"page-device-success\">\n    <div class=\"lead\">\n        <h1>Success</h1>\n        <p>You have successfully authorized the device</p>\n    </div>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Device/UserCodeCapture.cshtml",
    "content": "@model string\n\n<div class=\"page-device-code\">\n    <div class=\"lead\">\n        <h1>User Code</h1>\n        <p>Please enter the code displayed on your device.</p>\n    </div>\n\n    <partial name=\"_ValidationSummary\" />\n\n    <div class=\"row\">\n        <div class=\"col-sm-6\">\n            <form asp-action=\"UserCodeCapture\">\n                <div class=\"form-group\">\n                    <label for=\"userCode\">User Code:</label>\n                    <input class=\"form-control\" for=\"userCode\" name=\"userCode\" autofocus />\n                </div>\n\n                <button class=\"btn btn-primary\" name=\"button\">Submit</button>\n            </form>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Device/UserCodeConfirmation.cshtml",
    "content": "@model DeviceAuthorizationViewModel\n\n<div class=\"page-device-confirmation\">\n    <div class=\"lead\">\n        @if (Model.ClientLogoUrl != null)\n        {\n            <div class=\"client-logo\"><img src=\"@Model.ClientLogoUrl\"></div>\n        }\n        <h1>\n            @Model.ClientName\n            <small class=\"text-muted\">is requesting your permission</small>\n        </h1>\n        @if (Model.ConfirmUserCode)\n        {\n            <p>Please confirm that the authorization request quotes the code: <strong>@Model.UserCode</strong>.</p>\n        }\n        <p>Uncheck the permissions you do not wish to grant.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-sm-8\">\n            <partial name=\"_ValidationSummary\" />\n        </div>\n    </div>\n\n    <form asp-action=\"Callback\">\n        <input asp-for=\"UserCode\" type=\"hidden\" value=\"@Model.UserCode\" />\n        <div class=\"row\">\n            <div class=\"col-sm-8\">\n                @if (Model.IdentityScopes.Any())\n                {\n                    <div class=\"form-group\">\n                        <div class=\"card\">\n                            <div class=\"card-header\">\n                                <span class=\"glyphicon glyphicon-user\"></span>\n                                Personal Information\n                            </div>\n                            <ul class=\"list-group list-group-flush\">\n                                @foreach (var scope in Model.IdentityScopes)\n                                {\n                                    <partial name=\"_ScopeListItem\" model=\"@scope\" />\n                                }\n                            </ul>\n                        </div>\n                    </div>\n                }\n\n                @if (Model.ApiScopes.Any())\n                {\n                    <div class=\"form-group\">\n                        <div class=\"card\">\n                            <div class=\"card-header\">\n                                <span class=\"glyphicon glyphicon-tasks\"></span>\n                                Application Access\n                            </div>\n                            <ul class=\"list-group list-group-flush\">\n                                @foreach (var scope in Model.ApiScopes)\n                                {\n                                    <partial name=\"_ScopeListItem\" model=\"scope\" />\n                                }\n                            </ul>\n                        </div>\n                    </div>\n                }\n\n                <div class=\"form-group\">\n                    <div class=\"card\">\n                        <div class=\"card-header\">\n                            <span class=\"glyphicon glyphicon-tasks\"></span>\n                            Description\n                        </div>\n                        <div class=\"card-body\">\n                            <input class=\"form-control\" placeholder=\"Description or name of device\" asp-for=\"Description\" autofocus>\n                        </div>\n                    </div>\n                </div>\n\n                @if (Model.AllowRememberConsent)\n                {\n                    <div class=\"form-group\">\n                        <div class=\"form-check\">\n                            <input class=\"form-check-input\" asp-for=\"RememberConsent\">\n                            <label class=\"form-check-label\" asp-for=\"RememberConsent\">\n                                <strong>Remember My Decision</strong>\n                            </label>\n                        </div>\n                    </div>\n                }\n            </div>\n        </div>\n\n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <button name=\"button\" value=\"yes\" class=\"btn btn-primary\" autofocus>Yes, Allow</button>\n                <button name=\"button\" value=\"no\" class=\"btn btn-secondary\">No, Do Not Allow</button>\n            </div>\n            <div class=\"col-sm-4 col-lg-auto\">\n                @if (Model.ClientUrl != null)\n                {\n                    <a class=\"btn btn-outline-info\" href=\"@Model.ClientUrl\">\n                        <span class=\"glyphicon glyphicon-info-sign\"></span>\n                        <strong>@Model.ClientName</strong>\n                    </a>\n                }\n            </div>\n        </div>\n    </form>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Diagnostics/Index.cshtml",
    "content": "@model DiagnosticsViewModel\n\n<div class=\"diagnostics-page\">\n    <div class=\"lead\">\n        <h1>Authentication Cookie</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col\">\n            <div class=\"card\">\n                <div class=\"card-header\">\n                    <h2>Claims</h2>\n                </div>\n                <div class=\"card-body\">\n                    <dl>\n                        @foreach (var claim in Model.AuthenticateResult.Principal.Claims)\n                        {\n                            <dt>@claim.Type</dt>\n                            <dd>@claim.Value</dd>\n                        }\n                    </dl>\n                </div>\n            </div>\n        </div>\n        \n        <div class=\"col\">\n            <div class=\"card\">\n                <div class=\"card-header\">\n                    <h2>Properties</h2>\n                </div>\n                <div class=\"card-body\">\n                    <dl>\n                        @foreach (var prop in Model.AuthenticateResult.Properties.Items)\n                        {\n                            <dt>@prop.Key</dt>\n                            <dd>@prop.Value</dd>\n                        }\n                        @if (Model.Clients.Any())\n                        {\n                            <dt>Clients</dt>\n                            <dd>\n                            @{\n                                var clients = Model.Clients.ToArray();\n                                for(var i = 0; i < clients.Length; i++)\n                                {\n                                    <text>@clients[i]</text>\n                                    if (i < clients.Length - 1)\n                                    {\n                                        <text>, </text>\n                                    }\n                                }\n                            }\n                            </dd>\n                        }\n                    </dl>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n\n\n\n"
  },
  {
    "path": "IdentityProvider/Views/Grants/Index.cshtml",
    "content": "﻿@model GrantsViewModel\n\n<div class=\"grants-page\">\n    <div class=\"lead\">\n        <h1>Client Application Permissions</h1>\n        <p>Below is the list of applications you have given permission to and the resources they have access to.</p>\n    </div>\n\n    @if (Model.Grants.Any() == false)\n    {\n        <div class=\"row\">\n            <div class=\"col-sm-8\">\n                <div class=\"alert alert-info\">\n                    You have not given access to any applications\n                </div>\n            </div>\n        </div>\n    }\n    else\n    {\n        foreach (var grant in Model.Grants)\n        {\n            <div class=\"card\">\n                <div class=\"card-header\">\n                    <div class=\"row\">\n                        <div class=\"col-sm-8 card-title\">\n                            @if (grant.ClientLogoUrl != null)\n                            {\n                                <img src=\"@grant.ClientLogoUrl\">\n                            }\n                            <strong>@grant.ClientName</strong>\n                        </div>\n\n                        <div class=\"col-sm-2\">\n                            <form asp-action=\"Revoke\">\n                                <input type=\"hidden\" name=\"clientId\" value=\"@grant.ClientId\">\n                                <button class=\"btn btn-danger\">Revoke Access</button>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n                \n                <ul class=\"list-group list-group-flush\">\n                    @if (grant.Description != null)\n                    {\n                        <li class=\"list-group-item\">\n                            <label>Description:</label> @grant.Description\n                        </li>   \n                    }\n                    <li class=\"list-group-item\">\n                        <label>Created:</label> @grant.Created.ToString(\"yyyy-MM-dd\")\n                    </li>\n                    @if (grant.Expires.HasValue)\n                    {\n                        <li class=\"list-group-item\">\n                            <label>Expires:</label> @grant.Expires.Value.ToString(\"yyyy-MM-dd\")\n                        </li>\n                    }\n                    @if (grant.IdentityGrantNames.Any())\n                    {\n                        <li class=\"list-group-item\">\n                            <label>Identity Grants</label>\n                            <ul>\n                                @foreach (var name in grant.IdentityGrantNames)\n                                {\n                                    <li>@name</li>\n                                }\n                            </ul>\n                        </li>\n                    }\n                    @if (grant.ApiGrantNames.Any())\n                    {\n                        <li class=\"list-group-item\">\n                            <label>API Grants</label>\n                            <ul>\n                                @foreach (var name in grant.ApiGrantNames)\n                                {\n                                    <li>@name</li>\n                                }\n                            </ul>\n                        </li>\n                    }\n                </ul>\n            </div>\n        }\n    }\n</div>"
  },
  {
    "path": "IdentityProvider/Views/Home/Index.cshtml",
    "content": "@using System.Reflection\n\n@{\n    var version = typeof(Duende.IdentityServer.Hosting.IdentityServerMiddleware).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion.Split('+').First();\n}\n\n<div class=\"welcome-page\">\n    <h1>\n        <img src=\"~/duende-logo.svg\" class=\"logo\">\n        Welcome to Duende IdentityServer\n        <small class=\"text-muted\">(version @version)</small>\n    </h1>\n\n    <ul>\n        <li>\n            IdentityServer publishes a\n            <a href=\"~/.well-known/openid-configuration\">discovery document</a>\n            where you can find metadata and links to all the endpoints, key material, etc.\n        </li>\n        <li>\n            Click <a href=\"~/diagnostics\">here</a> to see the claims for your current session.\n        </li>\n        <li>\n            Click <a href=\"~/grants\">here</a> to manage your stored grants.\n        </li>\n        <li>\n            Here are links to the\n            <a href=\"https://github.com/duendesoftware/IdentityServer\">source code repository</a>,\n            and <a href=\"https://github.com/duendesoftware/samples\">ready to use samples</a>.\n        </li>\n    </ul>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Shared/Error.cshtml",
    "content": "@model ErrorViewModel\n\n@{\n    var error = Model?.Error?.Error;\n    var errorDescription = Model?.Error?.ErrorDescription;\n    var request_id = Model?.Error?.RequestId;\n}\n\n<div class=\"error-page\">\n    <div class=\"lead\">\n        <h1>Error</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-sm-6\">\n            <div class=\"alert alert-danger\">\n                Sorry, there was an error\n\n                @if (error != null)\n                {\n                    <strong>\n                        <em>\n                            : @error\n                        </em>\n                    </strong>\n\n                    if (errorDescription != null)\n                    {\n                        <div>@errorDescription</div>\n                    }\n                }\n            </div>\n\n            @if (request_id != null)\n            {\n                <div class=\"request-id\">Request Id: @request_id</div>\n            }\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Shared/Redirect.cshtml",
    "content": "@model RedirectViewModel\n\n<div class=\"redirect-page\">\n    <div class=\"lead\">\n        <h1>You are now being returned to the application</h1>\n        <p>Once complete, you may close this tab.</p>\n    </div>\n</div>\n\n<meta http-equiv=\"refresh\" content=\"0;url=@Model.RedirectUrl\" data-url=\"@Model.RedirectUrl\">\n<script src=\"~/js/signin-redirect.js\"></script>\n"
  },
  {
    "path": "IdentityProvider/Views/Shared/_Layout.cshtml",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\" />\n\n    <title>Duende IdentityServer</title>\n    \n    <link rel=\"icon\" type=\"image/x-icon\" href=\"~/favicon.ico\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"~/favicon.ico\" />\n    \n    <link rel=\"stylesheet\" href=\"~/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"~/css/bootstrap-glyphicons.min.css\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.min.css\" />\n</head>\n<body>\n    <partial name=\"_Nav\" />\n   \n    <div class=\"container body-container\">\n        @RenderBody()\n    </div>\n\n    <script src=\"~/js/jquery.slim.min.js\"></script>\n    <script src=\"~/js/bootstrap.bundle.min.js\"></script>\n\n    @RenderSection(\"scripts\", required: false)\n</body>\n</html>\n"
  },
  {
    "path": "IdentityProvider/Views/Shared/_Nav.cshtml",
    "content": "@using Duende.IdentityServer.Extensions\n@{\n    string name = null;\n    if (!true.Equals(ViewData[\"signed-out\"]))\n    {\n        name = Context.User?.GetDisplayName();\n    }\n}\n\n<div class=\"nav-page\">\n    <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\">\n\n        <a href=\"~/\" class=\"navbar-brand\">\n            <img src=\"~/duende-logo.svg\" class=\"icon-banner\">\n            Duende IdentityServer\n        </a>\n\n        @if (!string.IsNullOrWhiteSpace(name))\n        {\n            <ul class=\"navbar-nav mr-auto\">\n                <li class=\"nav-item dropdown\">\n                    <a href=\"#\" class=\"nav-link dropdown-toggle\" data-toggle=\"dropdown\">@name <b class=\"caret\"></b></a>\n                    \n                    <div class=\"dropdown-menu\">\n                        <a class=\"dropdown-item\" asp-action=\"Logout\" asp-controller=\"Account\">Logout</a>\n                    </div>\n              </li>\n            </ul>\n        }\n    \n    </nav>\n</div>\n"
  },
  {
    "path": "IdentityProvider/Views/Shared/_ScopeListItem.cshtml",
    "content": "@model ScopeViewModel\n\n<li class=\"list-group-item\">\n    <label>\n        <input class=\"consent-scopecheck\"\n               type=\"checkbox\"\n               name=\"ScopesConsented\"\n               id=\"scopes_@Model.Value\"\n               value=\"@Model.Value\"\n               checked=\"@Model.Checked\"\n               disabled=\"@Model.Required\" />\n        @if (Model.Required)\n        {\n            <input type=\"hidden\"\n                   name=\"ScopesConsented\"\n                   value=\"@Model.Value\" />\n        }\n        <strong>@Model.DisplayName</strong>\n        @if (Model.Emphasize)\n        {\n            <span class=\"glyphicon glyphicon-exclamation-sign\"></span>\n        }\n    </label>\n    @if (Model.Required)\n    {\n        <span><em>(required)</em></span>\n    }\n    @if (Model.Description != null)\n    {\n        <div class=\"consent-description\">\n            <label for=\"scopes_@Model.Value\">@Model.Description</label>\n        </div>\n    }\n    @if (Model.Resources?.Any() == true)\n    {\n        <div class=\"consent-description\">\n            <label>Will be available to these resource servers:</label>\n            <ul>\n            @foreach (var resource in Model.Resources)\n            {\n                <li>@resource.DisplayName</li>\n            }\n            </ul>\n        </div>\n    }\n</li>"
  },
  {
    "path": "IdentityProvider/Views/Shared/_ValidationSummary.cshtml",
    "content": "﻿@if (ViewContext.ModelState.IsValid == false)\n{\n    <div class=\"alert alert-danger\">\n        <strong>Error</strong>\n        <div asp-validation-summary=\"All\" class=\"danger\"></div>\n    </div>\n}"
  },
  {
    "path": "IdentityProvider/Views/_ViewImports.cshtml",
    "content": "﻿@using IdentityServerHost.Quickstart.UI\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n"
  },
  {
    "path": "IdentityProvider/Views/_ViewStart.cshtml",
    "content": "﻿@{\n    Layout = \"_Layout\";\n}\n"
  },
  {
    "path": "IdentityProvider/wwwroot/js/signin-redirect.js",
    "content": "window.location.href = document.querySelector(\"meta[http-equiv=refresh]\").getAttribute(\"data-url\");\n"
  },
  {
    "path": "IdentityProvider/wwwroot/js/signout-redirect.js",
    "content": "﻿window.addEventListener(\"load\", function () {\n    var a = document.querySelector(\"a.PostLogoutRedirectUri\");\n    if (a) {\n        window.location = a.href;\n    }\n});\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Scott Brady\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Getting Started with IdentityServer4 and Duende IdentityServer\nExample IdentityServer implementation, including a basic API (protected resource) and MVC app (client application).\n\nThis is the completed sample code for the [Getting Started with IdentityServer4 and Duende IdentityServer](https://www.scottbrady91.com/Identity-Server/Getting-Started-with-IdentityServer-4) tutorial on scottbrady91.com.\n\n- [IdentityServer4 example code](https://github.com/scottbrady91/IdentityServer4-Example/tree/IdentityServer4)\n- [Duende IdentityServer example code](https://github.com/scottbrady91/IdentityServer4-Example/tree/master)\n\n## Further Reading\n\nFor more advanced use cases, check out some of my other articles to learn how to:\n- [Choose the right architecture for protecting your SPA](https://www.scottbrady91.com/OAuth/Cheat-Sheet-OAuth-for-Browser-Based-Applications)\n- [Using asymmetric secrets for client authentication (no more shared secrets!)](https://www.scottbrady91.com/OAuth/Removing-Shared-Secrets-for-OAuth-Client-Authentication)\n- [Handle API gateways authorization and API-to-API communication](https://www.scottbrady91.com/OAuth/Delegation-Patterns-for-OAuth-20)\n- [Outsourcing token signing to Azure Key Vault](https://www.scottbrady91.com/Identity-Server/Outsourcing-IdentityServer4-Token-Signing-to-Azure-Key-Vault)\n\nFor older versions of this tutorial, check out the [aspnetcore1](https://github.com/scottbrady91/IdentityServer4-Example/tree/aspnetcore1) and [aspnetcore2](https://github.com/scottbrady91/IdentityServer4-Example/tree/aspnetcore2) branches.\n"
  },
  {
    "path": "ScottBrady91.IdentityServer4.Example.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30114.105\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IdentityProvider\", \"IdentityProvider\\IdentityProvider.csproj\", \"{130A257C-A56E-4DF7-B345-29E55DAFE008}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"API\", \"API\\API.csproj\", \"{E7164672-4D5C-4BDD-948A-C90D6ABC97CF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Client\", \"Client\\Client.csproj\", \"{EAC3E41C-1FE3-49BC-988F-2027E09D04DB}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{130A257C-A56E-4DF7-B345-29E55DAFE008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{130A257C-A56E-4DF7-B345-29E55DAFE008}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{130A257C-A56E-4DF7-B345-29E55DAFE008}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{130A257C-A56E-4DF7-B345-29E55DAFE008}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E7164672-4D5C-4BDD-948A-C90D6ABC97CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E7164672-4D5C-4BDD-948A-C90D6ABC97CF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E7164672-4D5C-4BDD-948A-C90D6ABC97CF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E7164672-4D5C-4BDD-948A-C90D6ABC97CF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EAC3E41C-1FE3-49BC-988F-2027E09D04DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EAC3E41C-1FE3-49BC-988F-2027E09D04DB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EAC3E41C-1FE3-49BC-988F-2027E09D04DB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EAC3E41C-1FE3-49BC-988F-2027E09D04DB}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AD863000-6A91-40B8-8146-841C2D9EE600}\n\tEndGlobalSection\nEndGlobal\n"
  }
]