Upgrade identityserver4 to 4.1.1, update the database context migration file, after my test, normal use.
This commit is contained in:
parent
76fbcffd90
commit
aa23e2a7a5
@ -126,9 +126,9 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers
|
|||||||
private async Task<LoginViewModel> BuildLoginViewModelAsync(string returnUrl, AuthorizationRequest context)
|
private async Task<LoginViewModel> BuildLoginViewModelAsync(string returnUrl, AuthorizationRequest context)
|
||||||
{
|
{
|
||||||
var allowLocal = true;
|
var allowLocal = true;
|
||||||
if (context?.ClientId != null)
|
if (context?.Client.ClientId != null)
|
||||||
{
|
{
|
||||||
var client = await _clientStore.FindEnabledClientByIdAsync(context.ClientId);
|
var client = await _clientStore.FindEnabledClientByIdAsync(context.Client.ClientId);
|
||||||
if (client != null)
|
if (client != null)
|
||||||
{
|
{
|
||||||
allowLocal = client.EnableLocalLogin;
|
allowLocal = client.EnableLocalLogin;
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
using IdentityServer4.Models;
|
using IdentityServer4.Events;
|
||||||
|
using IdentityServer4.Extensions;
|
||||||
|
using IdentityServer4.Models;
|
||||||
using IdentityServer4.Services;
|
using IdentityServer4.Services;
|
||||||
using IdentityServer4.Stores;
|
using IdentityServer4.Stores;
|
||||||
|
using IdentityServer4.Validation;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels;
|
using Microsoft.eShopOnContainers.Services.Identity.API.Extensions;
|
||||||
|
using Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -14,22 +20,18 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ConsentController : Controller
|
public class ConsentController : Controller
|
||||||
{
|
{
|
||||||
private readonly ILogger<ConsentController> _logger;
|
|
||||||
private readonly IClientStore _clientStore;
|
|
||||||
private readonly IResourceStore _resourceStore;
|
|
||||||
private readonly IIdentityServerInteractionService _interaction;
|
private readonly IIdentityServerInteractionService _interaction;
|
||||||
|
private readonly IEventService _events;
|
||||||
|
private readonly ILogger<ConsentController> _logger;
|
||||||
|
|
||||||
public ConsentController(
|
public ConsentController(
|
||||||
ILogger<ConsentController> logger,
|
|
||||||
IIdentityServerInteractionService interaction,
|
IIdentityServerInteractionService interaction,
|
||||||
IClientStore clientStore,
|
IEventService events,
|
||||||
IResourceStore resourceStore)
|
ILogger<ConsentController> logger)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
|
||||||
_interaction = interaction;
|
_interaction = interaction;
|
||||||
_clientStore = clientStore;
|
_events = events;
|
||||||
_resourceStore = resourceStore;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -41,7 +43,6 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers
|
|||||||
public async Task<IActionResult> Index(string returnUrl)
|
public async Task<IActionResult> Index(string returnUrl)
|
||||||
{
|
{
|
||||||
var vm = await BuildViewModelAsync(returnUrl);
|
var vm = await BuildViewModelAsync(returnUrl);
|
||||||
ViewData["ReturnUrl"] = returnUrl;
|
|
||||||
if (vm != null)
|
if (vm != null)
|
||||||
{
|
{
|
||||||
return View("Index", vm);
|
return View("Index", vm);
|
||||||
@ -57,77 +58,111 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers
|
|||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public async Task<IActionResult> Index(ConsentInputModel model)
|
public async Task<IActionResult> Index(ConsentInputModel model)
|
||||||
{
|
{
|
||||||
// parse the return URL back to an AuthorizeRequest object
|
var result = await ProcessConsent(model);
|
||||||
var request = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);
|
|
||||||
ConsentResponse response = null;
|
|
||||||
|
|
||||||
// user clicked 'no' - send back the standard 'access_denied' response
|
if (result.IsRedirect)
|
||||||
if (model.Button == "no")
|
|
||||||
{
|
{
|
||||||
response = ConsentResponse.Denied;
|
var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);
|
||||||
}
|
if (context?.IsNativeClient() == true)
|
||||||
// user clicked 'yes' - validate the data
|
|
||||||
else if (model.Button == "yes" && model != null)
|
|
||||||
{
|
|
||||||
// if the user consented to some scope, build the response model
|
|
||||||
if (model.ScopesConsented != null && model.ScopesConsented.Any())
|
|
||||||
{
|
{
|
||||||
response = new ConsentResponse
|
// The client is native, so this change in how to
|
||||||
{
|
// return the response is for better UX for the end user.
|
||||||
RememberConsent = model.RememberConsent,
|
return this.LoadingPage("Redirect", result.RedirectUri);
|
||||||
ScopesConsented = model.ScopesConsented
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
return Redirect(result.RedirectUri);
|
||||||
ModelState.AddModelError("", "You must pick at least one permission.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ModelState.AddModelError("", "Invalid Selection");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response != null)
|
if (result.HasValidationError)
|
||||||
{
|
{
|
||||||
// communicate outcome of consent back to identityserver
|
ModelState.AddModelError(string.Empty, result.ValidationError);
|
||||||
await _interaction.GrantConsentAsync(request, response);
|
|
||||||
|
|
||||||
// redirect back to authorization endpoint
|
|
||||||
return Redirect(model.ReturnUrl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var vm = await BuildViewModelAsync(model.ReturnUrl, model);
|
if (result.ShowView)
|
||||||
if (vm != null)
|
|
||||||
{
|
{
|
||||||
return View("Index", vm);
|
return View("Index", result.ViewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
return View("Error");
|
return View("Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task<ConsentViewModel> BuildViewModelAsync(string returnUrl, ConsentInputModel model = null)
|
/*****************************************/
|
||||||
|
/* helper APIs for the ConsentController */
|
||||||
|
/*****************************************/
|
||||||
|
private async Task<ProcessConsentResult> ProcessConsent(ConsentInputModel model)
|
||||||
|
{
|
||||||
|
var result = new ProcessConsentResult();
|
||||||
|
|
||||||
|
// validate return url is still valid
|
||||||
|
var request = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);
|
||||||
|
if (request == null) return result;
|
||||||
|
|
||||||
|
ConsentResponse grantedConsent = null;
|
||||||
|
|
||||||
|
// user clicked 'no' - send back the standard 'access_denied' response
|
||||||
|
if (model?.Button == "no")
|
||||||
|
{
|
||||||
|
grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied };
|
||||||
|
|
||||||
|
// emit event
|
||||||
|
await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues));
|
||||||
|
}
|
||||||
|
// user clicked 'yes' - validate the data
|
||||||
|
else if (model?.Button == "yes")
|
||||||
|
{
|
||||||
|
// if the user consented to some scope, build the response model
|
||||||
|
if (model.ScopesConsented != null && model.ScopesConsented.Any())
|
||||||
|
{
|
||||||
|
var scopes = model.ScopesConsented;
|
||||||
|
if (ConsentOptions.EnableOfflineAccess == false)
|
||||||
|
{
|
||||||
|
scopes = scopes.Where(x => x != IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
grantedConsent = new ConsentResponse
|
||||||
|
{
|
||||||
|
RememberConsent = model.RememberConsent,
|
||||||
|
ScopesValuesConsented = scopes.ToArray(),
|
||||||
|
Description = model.Description
|
||||||
|
};
|
||||||
|
|
||||||
|
// emit event
|
||||||
|
await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.ValidationError = ConsentOptions.MustChooseOneErrorMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grantedConsent != null)
|
||||||
|
{
|
||||||
|
// communicate outcome of consent back to identityserver
|
||||||
|
await _interaction.GrantConsentAsync(request, grantedConsent);
|
||||||
|
|
||||||
|
// indicate that's it ok to redirect back to authorization endpoint
|
||||||
|
result.RedirectUri = model.ReturnUrl;
|
||||||
|
result.Client = request.Client;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we need to redisplay the consent UI
|
||||||
|
result.ViewModel = await BuildViewModelAsync(model.ReturnUrl, model);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<ConsentViewModel> BuildViewModelAsync(string returnUrl, ConsentInputModel model = null)
|
||||||
{
|
{
|
||||||
var request = await _interaction.GetAuthorizationContextAsync(returnUrl);
|
var request = await _interaction.GetAuthorizationContextAsync(returnUrl);
|
||||||
if (request != null)
|
if (request != null)
|
||||||
{
|
{
|
||||||
var client = await _clientStore.FindEnabledClientByIdAsync(request.ClientId);
|
return CreateConsentViewModel(model, returnUrl, request);
|
||||||
if (client != null)
|
|
||||||
{
|
|
||||||
var resources = await _resourceStore.FindEnabledResourcesByScopeAsync(request.ScopesRequested);
|
|
||||||
if (resources != null && (resources.IdentityResources.Any() || resources.ApiResources.Any()))
|
|
||||||
{
|
|
||||||
return new ConsentViewModel(model, returnUrl, request, client, resources);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.LogError("No scopes matching: {0}", request.ScopesRequested.Aggregate((x, y) => x + ", " + y));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.LogError("Invalid client id: {0}", request.ClientId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -136,5 +171,88 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ConsentViewModel CreateConsentViewModel(
|
||||||
|
ConsentInputModel model, string returnUrl,
|
||||||
|
AuthorizationRequest request)
|
||||||
|
{
|
||||||
|
var vm = new ConsentViewModel
|
||||||
|
{
|
||||||
|
RememberConsent = model?.RememberConsent ?? true,
|
||||||
|
ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty<string>(),
|
||||||
|
Description = model?.Description,
|
||||||
|
|
||||||
|
ReturnUrl = returnUrl,
|
||||||
|
|
||||||
|
ClientName = request.Client.ClientName ?? request.Client.ClientId,
|
||||||
|
ClientUrl = request.Client.ClientUri,
|
||||||
|
ClientLogoUrl = request.Client.LogoUri,
|
||||||
|
AllowRememberConsent = request.Client.AllowRememberConsent
|
||||||
|
};
|
||||||
|
|
||||||
|
vm.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => CreateScopeViewModel(x, vm.ScopesConsented.Contains(x.Name) || model == null)).ToArray();
|
||||||
|
|
||||||
|
var apiScopes = new List<ScopeViewModel>();
|
||||||
|
foreach (var parsedScope in request.ValidatedResources.ParsedScopes)
|
||||||
|
{
|
||||||
|
var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName);
|
||||||
|
if (apiScope != null)
|
||||||
|
{
|
||||||
|
var scopeVm = CreateScopeViewModel(parsedScope, apiScope, vm.ScopesConsented.Contains(parsedScope.RawValue) || model == null);
|
||||||
|
apiScopes.Add(scopeVm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess)
|
||||||
|
{
|
||||||
|
apiScopes.Add(GetOfflineAccessScope(vm.ScopesConsented.Contains(IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess) || model == null));
|
||||||
|
}
|
||||||
|
vm.ApiScopes = apiScopes;
|
||||||
|
|
||||||
|
return vm;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check)
|
||||||
|
{
|
||||||
|
return new ScopeViewModel
|
||||||
|
{
|
||||||
|
Value = identity.Name,
|
||||||
|
DisplayName = identity.DisplayName ?? identity.Name,
|
||||||
|
Description = identity.Description,
|
||||||
|
Emphasize = identity.Emphasize,
|
||||||
|
Required = identity.Required,
|
||||||
|
Checked = check || identity.Required
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check)
|
||||||
|
{
|
||||||
|
var displayName = apiScope.DisplayName ?? apiScope.Name;
|
||||||
|
if (!String.IsNullOrWhiteSpace(parsedScopeValue.ParsedParameter))
|
||||||
|
{
|
||||||
|
displayName += ":" + parsedScopeValue.ParsedParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ScopeViewModel
|
||||||
|
{
|
||||||
|
Value = parsedScopeValue.RawValue,
|
||||||
|
DisplayName = displayName,
|
||||||
|
Description = apiScope.Description,
|
||||||
|
Emphasize = apiScope.Emphasize,
|
||||||
|
Required = apiScope.Required,
|
||||||
|
Checked = check || apiScope.Required
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScopeViewModel GetOfflineAccessScope(bool check)
|
||||||
|
{
|
||||||
|
return new ScopeViewModel
|
||||||
|
{
|
||||||
|
Value = IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess,
|
||||||
|
DisplayName = ConsentOptions.OfflineAccessDisplayName,
|
||||||
|
Description = ConsentOptions.OfflineAccessDescription,
|
||||||
|
Emphasize = true,
|
||||||
|
Checked = check
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
28
src/Services/Identity/Identity.API/Extensions/Extensions.cs
Normal file
28
src/Services/Identity/Identity.API/Extensions/Extensions.cs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using IdentityServer4.Models;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Extensions
|
||||||
|
{
|
||||||
|
public static class Extensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if the redirect URI is for a native client.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool IsNativeClient(this AuthorizationRequest context)
|
||||||
|
{
|
||||||
|
return !context.RedirectUri.StartsWith("https", StringComparison.Ordinal)
|
||||||
|
&& !context.RedirectUri.StartsWith("http", StringComparison.Ordinal);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IActionResult LoadingPage(this Controller controller, string viewName, string redirectUri)
|
||||||
|
{
|
||||||
|
controller.HttpContext.Response.StatusCode = 200;
|
||||||
|
controller.HttpContext.Response.Headers["Location"] = "";
|
||||||
|
|
||||||
|
return controller.View(viewName, new RedirectViewModel { RedirectUrl = redirectUri });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -19,11 +19,11 @@
|
|||||||
<PackageReference Include="AspNetCore.HealthChecks.SqlServer" Version="5.0.1" />
|
<PackageReference Include="AspNetCore.HealthChecks.SqlServer" Version="5.0.1" />
|
||||||
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="5.0.1" />
|
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="5.0.1" />
|
||||||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
|
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
|
||||||
<PackageReference Include="IdentityServer4.AspNetIdentity" Version="3.1.4" />
|
<PackageReference Include="IdentityServer4.AspNetIdentity" Version="4.1.1" />
|
||||||
<PackageReference Include="IdentityServer4.EntityFramework.Storage" Version="3.1.4" />
|
<PackageReference Include="IdentityServer4.EntityFramework.Storage" Version="4.1.1" />
|
||||||
<PackageReference Include="IdentityServer4.EntityFramework" Version="3.1.4" />
|
<PackageReference Include="IdentityServer4.EntityFramework" Version="4.1.1" />
|
||||||
<PackageReference Include="IdentityServer4.Storage" Version="3.1.4" />
|
<PackageReference Include="IdentityServer4.Storage" Version="4.1.1" />
|
||||||
<PackageReference Include="IdentityServer4" Version="3.1.4" />
|
<PackageReference Include="IdentityServer4" Version="4.1.1" />
|
||||||
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.16.0" />
|
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.16.0" />
|
||||||
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.16.0" />
|
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.16.0" />
|
||||||
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.1.3" />
|
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.1.3" />
|
||||||
@ -38,6 +38,10 @@
|
|||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.2" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.2" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.2" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.2" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.2">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.11" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.11" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.2" />
|
<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.2" />
|
||||||
<PackageReference Include="Microsoft.Web.LibraryManager.Build" Version="2.1.113" />
|
<PackageReference Include="Microsoft.Web.LibraryManager.Build" Version="2.1.113" />
|
||||||
@ -63,7 +67,10 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Extensions\" />
|
<Folder Include="Migrations\ConfigurationDb\" />
|
||||||
|
<Folder Include="Migrations\PersistedGrantDb\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,608 +0,0 @@
|
|||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Identity.API.Migrations.ConfigurationDb
|
|
||||||
{
|
|
||||||
public partial class InitialConfigurationMigration : Migration
|
|
||||||
{
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ApiResources",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Enabled = table.Column<bool>(nullable: false),
|
|
||||||
Name = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
DisplayName = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
Description = table.Column<string>(maxLength: 1000, nullable: true),
|
|
||||||
Created = table.Column<DateTime>(nullable: false),
|
|
||||||
Updated = table.Column<DateTime>(nullable: true),
|
|
||||||
LastAccessed = table.Column<DateTime>(nullable: true),
|
|
||||||
NonEditable = table.Column<bool>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ApiResources", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Clients",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Enabled = table.Column<bool>(nullable: false),
|
|
||||||
ClientId = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
ProtocolType = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
RequireClientSecret = table.Column<bool>(nullable: false),
|
|
||||||
ClientName = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
Description = table.Column<string>(maxLength: 1000, nullable: true),
|
|
||||||
ClientUri = table.Column<string>(maxLength: 2000, nullable: true),
|
|
||||||
LogoUri = table.Column<string>(maxLength: 2000, nullable: true),
|
|
||||||
RequireConsent = table.Column<bool>(nullable: false),
|
|
||||||
AllowRememberConsent = table.Column<bool>(nullable: false),
|
|
||||||
AlwaysIncludeUserClaimsInIdToken = table.Column<bool>(nullable: false),
|
|
||||||
RequirePkce = table.Column<bool>(nullable: false),
|
|
||||||
AllowPlainTextPkce = table.Column<bool>(nullable: false),
|
|
||||||
AllowAccessTokensViaBrowser = table.Column<bool>(nullable: false),
|
|
||||||
FrontChannelLogoutUri = table.Column<string>(maxLength: 2000, nullable: true),
|
|
||||||
FrontChannelLogoutSessionRequired = table.Column<bool>(nullable: false),
|
|
||||||
BackChannelLogoutUri = table.Column<string>(maxLength: 2000, nullable: true),
|
|
||||||
BackChannelLogoutSessionRequired = table.Column<bool>(nullable: false),
|
|
||||||
AllowOfflineAccess = table.Column<bool>(nullable: false),
|
|
||||||
IdentityTokenLifetime = table.Column<int>(nullable: false),
|
|
||||||
AccessTokenLifetime = table.Column<int>(nullable: false),
|
|
||||||
AuthorizationCodeLifetime = table.Column<int>(nullable: false),
|
|
||||||
ConsentLifetime = table.Column<int>(nullable: true),
|
|
||||||
AbsoluteRefreshTokenLifetime = table.Column<int>(nullable: false),
|
|
||||||
SlidingRefreshTokenLifetime = table.Column<int>(nullable: false),
|
|
||||||
RefreshTokenUsage = table.Column<int>(nullable: false),
|
|
||||||
UpdateAccessTokenClaimsOnRefresh = table.Column<bool>(nullable: false),
|
|
||||||
RefreshTokenExpiration = table.Column<int>(nullable: false),
|
|
||||||
AccessTokenType = table.Column<int>(nullable: false),
|
|
||||||
EnableLocalLogin = table.Column<bool>(nullable: false),
|
|
||||||
IncludeJwtId = table.Column<bool>(nullable: false),
|
|
||||||
AlwaysSendClientClaims = table.Column<bool>(nullable: false),
|
|
||||||
ClientClaimsPrefix = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
PairWiseSubjectSalt = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
Created = table.Column<DateTime>(nullable: false),
|
|
||||||
Updated = table.Column<DateTime>(nullable: true),
|
|
||||||
LastAccessed = table.Column<DateTime>(nullable: true),
|
|
||||||
UserSsoLifetime = table.Column<int>(nullable: true),
|
|
||||||
UserCodeType = table.Column<string>(maxLength: 100, nullable: true),
|
|
||||||
DeviceCodeLifetime = table.Column<int>(nullable: false),
|
|
||||||
NonEditable = table.Column<bool>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Clients", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "IdentityResources",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Enabled = table.Column<bool>(nullable: false),
|
|
||||||
Name = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
DisplayName = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
Description = table.Column<string>(maxLength: 1000, nullable: true),
|
|
||||||
Required = table.Column<bool>(nullable: false),
|
|
||||||
Emphasize = table.Column<bool>(nullable: false),
|
|
||||||
ShowInDiscoveryDocument = table.Column<bool>(nullable: false),
|
|
||||||
Created = table.Column<DateTime>(nullable: false),
|
|
||||||
Updated = table.Column<DateTime>(nullable: true),
|
|
||||||
NonEditable = table.Column<bool>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_IdentityResources", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ApiClaims",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Type = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
ApiResourceId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ApiClaims", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ApiClaims_ApiResources_ApiResourceId",
|
|
||||||
column: x => x.ApiResourceId,
|
|
||||||
principalTable: "ApiResources",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ApiProperties",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Key = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
Value = table.Column<string>(maxLength: 2000, nullable: false),
|
|
||||||
ApiResourceId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ApiProperties", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ApiProperties_ApiResources_ApiResourceId",
|
|
||||||
column: x => x.ApiResourceId,
|
|
||||||
principalTable: "ApiResources",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ApiScopes",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Name = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
DisplayName = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
Description = table.Column<string>(maxLength: 1000, nullable: true),
|
|
||||||
Required = table.Column<bool>(nullable: false),
|
|
||||||
Emphasize = table.Column<bool>(nullable: false),
|
|
||||||
ShowInDiscoveryDocument = table.Column<bool>(nullable: false),
|
|
||||||
ApiResourceId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ApiScopes", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ApiScopes_ApiResources_ApiResourceId",
|
|
||||||
column: x => x.ApiResourceId,
|
|
||||||
principalTable: "ApiResources",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ApiSecrets",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Description = table.Column<string>(maxLength: 1000, nullable: true),
|
|
||||||
Value = table.Column<string>(maxLength: 4000, nullable: false),
|
|
||||||
Expiration = table.Column<DateTime>(nullable: true),
|
|
||||||
Type = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
Created = table.Column<DateTime>(nullable: false),
|
|
||||||
ApiResourceId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ApiSecrets", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ApiSecrets_ApiResources_ApiResourceId",
|
|
||||||
column: x => x.ApiResourceId,
|
|
||||||
principalTable: "ApiResources",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientClaims",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Type = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
Value = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientClaims", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientClaims_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientCorsOrigins",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Origin = table.Column<string>(maxLength: 150, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientCorsOrigins", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientCorsOrigins_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientGrantTypes",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
GrantType = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientGrantTypes", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientGrantTypes_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientIdPRestrictions",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Provider = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientIdPRestrictions", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientIdPRestrictions_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientPostLogoutRedirectUris",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
PostLogoutRedirectUri = table.Column<string>(maxLength: 2000, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientPostLogoutRedirectUris", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientPostLogoutRedirectUris_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientProperties",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Key = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
Value = table.Column<string>(maxLength: 2000, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientProperties", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientProperties_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientRedirectUris",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
RedirectUri = table.Column<string>(maxLength: 2000, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientRedirectUris", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientRedirectUris_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientScopes",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Scope = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientScopes", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientScopes_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ClientSecrets",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Description = table.Column<string>(maxLength: 2000, nullable: true),
|
|
||||||
Value = table.Column<string>(maxLength: 4000, nullable: false),
|
|
||||||
Expiration = table.Column<DateTime>(nullable: true),
|
|
||||||
Type = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
Created = table.Column<DateTime>(nullable: false),
|
|
||||||
ClientId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ClientSecrets", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ClientSecrets_Clients_ClientId",
|
|
||||||
column: x => x.ClientId,
|
|
||||||
principalTable: "Clients",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "IdentityClaims",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Type = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
IdentityResourceId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_IdentityClaims", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_IdentityClaims_IdentityResources_IdentityResourceId",
|
|
||||||
column: x => x.IdentityResourceId,
|
|
||||||
principalTable: "IdentityResources",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "IdentityProperties",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Key = table.Column<string>(maxLength: 250, nullable: false),
|
|
||||||
Value = table.Column<string>(maxLength: 2000, nullable: false),
|
|
||||||
IdentityResourceId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_IdentityProperties", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_IdentityProperties_IdentityResources_IdentityResourceId",
|
|
||||||
column: x => x.IdentityResourceId,
|
|
||||||
principalTable: "IdentityResources",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ApiScopeClaims",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(nullable: false)
|
|
||||||
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
|
|
||||||
Type = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
ApiScopeId = table.Column<int>(nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ApiScopeClaims", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ApiScopeClaims_ApiScopes_ApiScopeId",
|
|
||||||
column: x => x.ApiScopeId,
|
|
||||||
principalTable: "ApiScopes",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiClaims_ApiResourceId",
|
|
||||||
table: "ApiClaims",
|
|
||||||
column: "ApiResourceId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiProperties_ApiResourceId",
|
|
||||||
table: "ApiProperties",
|
|
||||||
column: "ApiResourceId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiResources_Name",
|
|
||||||
table: "ApiResources",
|
|
||||||
column: "Name",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiScopeClaims_ApiScopeId",
|
|
||||||
table: "ApiScopeClaims",
|
|
||||||
column: "ApiScopeId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiScopes_ApiResourceId",
|
|
||||||
table: "ApiScopes",
|
|
||||||
column: "ApiResourceId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiScopes_Name",
|
|
||||||
table: "ApiScopes",
|
|
||||||
column: "Name",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApiSecrets_ApiResourceId",
|
|
||||||
table: "ApiSecrets",
|
|
||||||
column: "ApiResourceId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientClaims_ClientId",
|
|
||||||
table: "ClientClaims",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientCorsOrigins_ClientId",
|
|
||||||
table: "ClientCorsOrigins",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientGrantTypes_ClientId",
|
|
||||||
table: "ClientGrantTypes",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientIdPRestrictions_ClientId",
|
|
||||||
table: "ClientIdPRestrictions",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientPostLogoutRedirectUris_ClientId",
|
|
||||||
table: "ClientPostLogoutRedirectUris",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientProperties_ClientId",
|
|
||||||
table: "ClientProperties",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientRedirectUris_ClientId",
|
|
||||||
table: "ClientRedirectUris",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Clients_ClientId",
|
|
||||||
table: "Clients",
|
|
||||||
column: "ClientId",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientScopes_ClientId",
|
|
||||||
table: "ClientScopes",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ClientSecrets_ClientId",
|
|
||||||
table: "ClientSecrets",
|
|
||||||
column: "ClientId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_IdentityClaims_IdentityResourceId",
|
|
||||||
table: "IdentityClaims",
|
|
||||||
column: "IdentityResourceId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_IdentityProperties_IdentityResourceId",
|
|
||||||
table: "IdentityProperties",
|
|
||||||
column: "IdentityResourceId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_IdentityResources_Name",
|
|
||||||
table: "IdentityResources",
|
|
||||||
column: "Name",
|
|
||||||
unique: true);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ApiClaims");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ApiProperties");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ApiScopeClaims");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ApiSecrets");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientClaims");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientCorsOrigins");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientGrantTypes");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientIdPRestrictions");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientPostLogoutRedirectUris");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientProperties");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientRedirectUris");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientScopes");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ClientSecrets");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "IdentityClaims");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "IdentityProperties");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ApiScopes");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Clients");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "IdentityResources");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ApiResources");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,657 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
namespace Identity.API.Migrations.ConfigurationDb
|
||||||
|
{
|
||||||
|
public partial class InitialConfigurationMigration : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiResources",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Enabled = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
DisplayName = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true),
|
||||||
|
AllowedAccessTokenSigningAlgorithms = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
|
||||||
|
ShowInDiscoveryDocument = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Created = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Updated = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
LastAccessed = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
NonEditable = table.Column<bool>(type: "bit", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiResources", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiScopes",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Enabled = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
DisplayName = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true),
|
||||||
|
Required = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Emphasize = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
ShowInDiscoveryDocument = table.Column<bool>(type: "bit", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiScopes", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Clients",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Enabled = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
ClientId = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
ProtocolType = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
RequireClientSecret = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
ClientName = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true),
|
||||||
|
ClientUri = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
|
||||||
|
LogoUri = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
|
||||||
|
RequireConsent = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
AllowRememberConsent = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
AlwaysIncludeUserClaimsInIdToken = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
RequirePkce = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
AllowPlainTextPkce = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
RequireRequestObject = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
AllowAccessTokensViaBrowser = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
FrontChannelLogoutUri = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
|
||||||
|
FrontChannelLogoutSessionRequired = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
BackChannelLogoutUri = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
|
||||||
|
BackChannelLogoutSessionRequired = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
AllowOfflineAccess = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
IdentityTokenLifetime = table.Column<int>(type: "int", nullable: false),
|
||||||
|
AllowedIdentityTokenSigningAlgorithms = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
|
||||||
|
AccessTokenLifetime = table.Column<int>(type: "int", nullable: false),
|
||||||
|
AuthorizationCodeLifetime = table.Column<int>(type: "int", nullable: false),
|
||||||
|
ConsentLifetime = table.Column<int>(type: "int", nullable: true),
|
||||||
|
AbsoluteRefreshTokenLifetime = table.Column<int>(type: "int", nullable: false),
|
||||||
|
SlidingRefreshTokenLifetime = table.Column<int>(type: "int", nullable: false),
|
||||||
|
RefreshTokenUsage = table.Column<int>(type: "int", nullable: false),
|
||||||
|
UpdateAccessTokenClaimsOnRefresh = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
RefreshTokenExpiration = table.Column<int>(type: "int", nullable: false),
|
||||||
|
AccessTokenType = table.Column<int>(type: "int", nullable: false),
|
||||||
|
EnableLocalLogin = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
IncludeJwtId = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
AlwaysSendClientClaims = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
ClientClaimsPrefix = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
PairWiseSubjectSalt = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
Created = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Updated = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
LastAccessed = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
UserSsoLifetime = table.Column<int>(type: "int", nullable: true),
|
||||||
|
UserCodeType = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
|
||||||
|
DeviceCodeLifetime = table.Column<int>(type: "int", nullable: false),
|
||||||
|
NonEditable = table.Column<bool>(type: "bit", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Clients", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "IdentityResources",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Enabled = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
DisplayName = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true),
|
||||||
|
Required = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Emphasize = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
ShowInDiscoveryDocument = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
Created = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Updated = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
NonEditable = table.Column<bool>(type: "bit", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_IdentityResources", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiResourceClaims",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ApiResourceId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiResourceClaims", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ApiResourceClaims_ApiResources_ApiResourceId",
|
||||||
|
column: x => x.ApiResourceId,
|
||||||
|
principalTable: "ApiResources",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiResourceProperties",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ApiResourceId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Key = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiResourceProperties", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ApiResourceProperties_ApiResources_ApiResourceId",
|
||||||
|
column: x => x.ApiResourceId,
|
||||||
|
principalTable: "ApiResources",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiResourceScopes",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Scope = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
ApiResourceId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiResourceScopes", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ApiResourceScopes_ApiResources_ApiResourceId",
|
||||||
|
column: x => x.ApiResourceId,
|
||||||
|
principalTable: "ApiResources",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiResourceSecrets",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ApiResourceId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(4000)", maxLength: 4000, nullable: false),
|
||||||
|
Expiration = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Created = table.Column<DateTime>(type: "datetime2", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiResourceSecrets", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ApiResourceSecrets_ApiResources_ApiResourceId",
|
||||||
|
column: x => x.ApiResourceId,
|
||||||
|
principalTable: "ApiResources",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiScopeClaims",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ScopeId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiScopeClaims", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ApiScopeClaims_ApiScopes_ScopeId",
|
||||||
|
column: x => x.ScopeId,
|
||||||
|
principalTable: "ApiScopes",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ApiScopeProperties",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ScopeId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Key = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ApiScopeProperties", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ApiScopeProperties_ApiScopes_ScopeId",
|
||||||
|
column: x => x.ScopeId,
|
||||||
|
principalTable: "ApiScopes",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientClaims",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientClaims", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientClaims_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientCorsOrigins",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Origin = table.Column<string>(type: "nvarchar(150)", maxLength: 150, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientCorsOrigins", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientCorsOrigins_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientGrantTypes",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
GrantType = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientGrantTypes", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientGrantTypes_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientIdPRestrictions",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Provider = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientIdPRestrictions", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientIdPRestrictions_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientPostLogoutRedirectUris",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
PostLogoutRedirectUri = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientPostLogoutRedirectUris", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientPostLogoutRedirectUris_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientProperties",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Key = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientProperties", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientProperties_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientRedirectUris",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
RedirectUri = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientRedirectUris", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientRedirectUris_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientScopes",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Scope = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientScopes", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientScopes_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ClientSecrets",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(4000)", maxLength: 4000, nullable: false),
|
||||||
|
Expiration = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Created = table.Column<DateTime>(type: "datetime2", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ClientSecrets", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ClientSecrets_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "IdentityResourceClaims",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
IdentityResourceId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_IdentityResourceClaims", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_IdentityResourceClaims_IdentityResources_IdentityResourceId",
|
||||||
|
column: x => x.IdentityResourceId,
|
||||||
|
principalTable: "IdentityResources",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "IdentityResourceProperties",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
IdentityResourceId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Key = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_IdentityResourceProperties", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_IdentityResourceProperties_IdentityResources_IdentityResourceId",
|
||||||
|
column: x => x.IdentityResourceId,
|
||||||
|
principalTable: "IdentityResources",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiResourceClaims_ApiResourceId",
|
||||||
|
table: "ApiResourceClaims",
|
||||||
|
column: "ApiResourceId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiResourceProperties_ApiResourceId",
|
||||||
|
table: "ApiResourceProperties",
|
||||||
|
column: "ApiResourceId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiResources_Name",
|
||||||
|
table: "ApiResources",
|
||||||
|
column: "Name",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiResourceScopes_ApiResourceId",
|
||||||
|
table: "ApiResourceScopes",
|
||||||
|
column: "ApiResourceId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiResourceSecrets_ApiResourceId",
|
||||||
|
table: "ApiResourceSecrets",
|
||||||
|
column: "ApiResourceId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiScopeClaims_ScopeId",
|
||||||
|
table: "ApiScopeClaims",
|
||||||
|
column: "ScopeId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiScopeProperties_ScopeId",
|
||||||
|
table: "ApiScopeProperties",
|
||||||
|
column: "ScopeId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ApiScopes_Name",
|
||||||
|
table: "ApiScopes",
|
||||||
|
column: "Name",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientClaims_ClientId",
|
||||||
|
table: "ClientClaims",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientCorsOrigins_ClientId",
|
||||||
|
table: "ClientCorsOrigins",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientGrantTypes_ClientId",
|
||||||
|
table: "ClientGrantTypes",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientIdPRestrictions_ClientId",
|
||||||
|
table: "ClientIdPRestrictions",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientPostLogoutRedirectUris_ClientId",
|
||||||
|
table: "ClientPostLogoutRedirectUris",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientProperties_ClientId",
|
||||||
|
table: "ClientProperties",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientRedirectUris_ClientId",
|
||||||
|
table: "ClientRedirectUris",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Clients_ClientId",
|
||||||
|
table: "Clients",
|
||||||
|
column: "ClientId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientScopes_ClientId",
|
||||||
|
table: "ClientScopes",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ClientSecrets_ClientId",
|
||||||
|
table: "ClientSecrets",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_IdentityResourceClaims_IdentityResourceId",
|
||||||
|
table: "IdentityResourceClaims",
|
||||||
|
column: "IdentityResourceId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_IdentityResourceProperties_IdentityResourceId",
|
||||||
|
table: "IdentityResourceProperties",
|
||||||
|
column: "IdentityResourceId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_IdentityResources_Name",
|
||||||
|
table: "IdentityResources",
|
||||||
|
column: "Name",
|
||||||
|
unique: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiResourceClaims");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiResourceProperties");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiResourceScopes");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiResourceSecrets");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiScopeClaims");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiScopeProperties");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientClaims");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientCorsOrigins");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientGrantTypes");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientIdPRestrictions");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientPostLogoutRedirectUris");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientProperties");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientRedirectUris");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientScopes");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ClientSecrets");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "IdentityResourceClaims");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "IdentityResourceProperties");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiResources");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ApiScopes");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Clients");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "IdentityResources");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -1,90 +0,0 @@
|
|||||||
// <auto-generated />
|
|
||||||
using System;
|
|
||||||
using IdentityServer4.EntityFramework.DbContexts;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
||||||
|
|
||||||
namespace Identity.API.Migrations.PersistedGrantDb
|
|
||||||
{
|
|
||||||
[DbContext(typeof(PersistedGrantDbContext))]
|
|
||||||
[Migration("20190729092100_InitialPersistedGrantMigration")]
|
|
||||||
partial class InitialPersistedGrantMigration
|
|
||||||
{
|
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
#pragma warning disable 612, 618
|
|
||||||
modelBuilder
|
|
||||||
.HasAnnotation("ProductVersion", "3.0.0-preview7.19362.6")
|
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 128)
|
|
||||||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
|
|
||||||
|
|
||||||
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.DeviceFlowCodes", b =>
|
|
||||||
{
|
|
||||||
b.Property<string>("UserCode")
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.Property<string>("ClientId")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreationTime");
|
|
||||||
|
|
||||||
b.Property<string>("Data")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(50000);
|
|
||||||
|
|
||||||
b.Property<string>("DeviceCode")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.Property<DateTime?>("Expiration")
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Property<string>("SubjectId")
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.HasKey("UserCode");
|
|
||||||
|
|
||||||
b.HasIndex("DeviceCode")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.ToTable("DeviceCodes");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.PersistedGrant", b =>
|
|
||||||
{
|
|
||||||
b.Property<string>("Key")
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.Property<string>("ClientId")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreationTime");
|
|
||||||
|
|
||||||
b.Property<string>("Data")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(50000);
|
|
||||||
|
|
||||||
b.Property<DateTime?>("Expiration");
|
|
||||||
|
|
||||||
b.Property<string>("SubjectId")
|
|
||||||
.HasMaxLength(200);
|
|
||||||
|
|
||||||
b.Property<string>("Type")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(50);
|
|
||||||
|
|
||||||
b.HasKey("Key");
|
|
||||||
|
|
||||||
b.HasIndex("SubjectId", "ClientId", "Type");
|
|
||||||
|
|
||||||
b.ToTable("PersistedGrants");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Identity.API.Migrations.PersistedGrantDb
|
|
||||||
{
|
|
||||||
public partial class InitialPersistedGrantMigration : Migration
|
|
||||||
{
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "DeviceCodes",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
UserCode = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
DeviceCode = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
SubjectId = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
ClientId = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
CreationTime = table.Column<DateTime>(nullable: false),
|
|
||||||
Expiration = table.Column<DateTime>(nullable: false),
|
|
||||||
Data = table.Column<string>(maxLength: 50000, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_DeviceCodes", x => x.UserCode);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "PersistedGrants",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Key = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
Type = table.Column<string>(maxLength: 50, nullable: false),
|
|
||||||
SubjectId = table.Column<string>(maxLength: 200, nullable: true),
|
|
||||||
ClientId = table.Column<string>(maxLength: 200, nullable: false),
|
|
||||||
CreationTime = table.Column<DateTime>(nullable: false),
|
|
||||||
Expiration = table.Column<DateTime>(nullable: true),
|
|
||||||
Data = table.Column<string>(maxLength: 50000, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_PersistedGrants", x => x.Key);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_DeviceCodes_DeviceCode",
|
|
||||||
table: "DeviceCodes",
|
|
||||||
column: "DeviceCode",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_PersistedGrants_SubjectId_ClientId_Type",
|
|
||||||
table: "PersistedGrants",
|
|
||||||
columns: new[] { "SubjectId", "ClientId", "Type" });
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "DeviceCodes");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "PersistedGrants");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,129 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using IdentityServer4.EntityFramework.DbContexts;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
|
||||||
|
namespace Identity.API.Migrations.PersistedGrantDb
|
||||||
|
{
|
||||||
|
[DbContext(typeof(PersistedGrantDbContext))]
|
||||||
|
[Migration("20210301145424_InitialPersistedGrantMigration")]
|
||||||
|
partial class InitialPersistedGrantMigration
|
||||||
|
{
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.UseIdentityColumns()
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128)
|
||||||
|
.HasAnnotation("ProductVersion", "5.0.2");
|
||||||
|
|
||||||
|
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.DeviceFlowCodes", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("UserCode")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<string>("ClientId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("Data")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50000)
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<string>("DeviceCode")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("Expiration")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("SessionId")
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.Property<string>("SubjectId")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.HasKey("UserCode");
|
||||||
|
|
||||||
|
b.HasIndex("DeviceCode")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.HasIndex("Expiration");
|
||||||
|
|
||||||
|
b.ToTable("DeviceCodes");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.PersistedGrant", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<string>("ClientId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ConsumedTime")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("Data")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50000)
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("Expiration")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("SessionId")
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.Property<string>("SubjectId")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<string>("Type")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("nvarchar(50)");
|
||||||
|
|
||||||
|
b.HasKey("Key");
|
||||||
|
|
||||||
|
b.HasIndex("Expiration");
|
||||||
|
|
||||||
|
b.HasIndex("SubjectId", "ClientId", "Type");
|
||||||
|
|
||||||
|
b.HasIndex("SubjectId", "SessionId", "Type");
|
||||||
|
|
||||||
|
b.ToTable("PersistedGrants");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
namespace Identity.API.Migrations.PersistedGrantDb
|
||||||
|
{
|
||||||
|
public partial class InitialPersistedGrantMigration : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "DeviceCodes",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
UserCode = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
DeviceCode = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
SubjectId = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
SessionId = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
|
||||||
|
ClientId = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Expiration = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Data = table.Column<string>(type: "nvarchar(max)", maxLength: 50000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_DeviceCodes", x => x.UserCode);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "PersistedGrants",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Key = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
Type = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||||
|
SubjectId = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
SessionId = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
|
||||||
|
ClientId = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
||||||
|
Description = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true),
|
||||||
|
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Expiration = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
ConsumedTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
Data = table.Column<string>(type: "nvarchar(max)", maxLength: 50000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_PersistedGrants", x => x.Key);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_DeviceCodes_DeviceCode",
|
||||||
|
table: "DeviceCodes",
|
||||||
|
column: "DeviceCode",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_DeviceCodes_Expiration",
|
||||||
|
table: "DeviceCodes",
|
||||||
|
column: "Expiration");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_PersistedGrants_Expiration",
|
||||||
|
table: "PersistedGrants",
|
||||||
|
column: "Expiration");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_PersistedGrants_SubjectId_ClientId_Type",
|
||||||
|
table: "PersistedGrants",
|
||||||
|
columns: new[] { "SubjectId", "ClientId", "Type" });
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_PersistedGrants_SubjectId_SessionId_Type",
|
||||||
|
table: "PersistedGrants",
|
||||||
|
columns: new[] { "SubjectId", "SessionId", "Type" });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "DeviceCodes");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "PersistedGrants");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,71 +15,110 @@ namespace Identity.API.Migrations.PersistedGrantDb
|
|||||||
{
|
{
|
||||||
#pragma warning disable 612, 618
|
#pragma warning disable 612, 618
|
||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "3.0.0-preview7.19362.6")
|
.UseIdentityColumns()
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 128)
|
.HasAnnotation("Relational:MaxIdentifierLength", 128)
|
||||||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
|
.HasAnnotation("ProductVersion", "5.0.2");
|
||||||
|
|
||||||
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.DeviceFlowCodes", b =>
|
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.DeviceFlowCodes", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("UserCode")
|
b.Property<string>("UserCode")
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<string>("ClientId")
|
b.Property<string>("ClientId")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<DateTime>("CreationTime");
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
b.Property<string>("Data")
|
b.Property<string>("Data")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(50000);
|
.HasMaxLength(50000)
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<string>("DeviceCode")
|
b.Property<string>("DeviceCode")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<DateTime?>("Expiration")
|
b.Property<DateTime?>("Expiration")
|
||||||
.IsRequired();
|
.IsRequired()
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("SessionId")
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
b.Property<string>("SubjectId")
|
b.Property<string>("SubjectId")
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.HasKey("UserCode");
|
b.HasKey("UserCode");
|
||||||
|
|
||||||
b.HasIndex("DeviceCode")
|
b.HasIndex("DeviceCode")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
|
b.HasIndex("Expiration");
|
||||||
|
|
||||||
b.ToTable("DeviceCodes");
|
b.ToTable("DeviceCodes");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.PersistedGrant", b =>
|
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.PersistedGrant", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("Key")
|
b.Property<string>("Key")
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<string>("ClientId")
|
b.Property<string>("ClientId")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<DateTime>("CreationTime");
|
b.Property<DateTime?>("ConsumedTime")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
b.Property<string>("Data")
|
b.Property<string>("Data")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(50000);
|
.HasMaxLength(50000)
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
b.Property<DateTime?>("Expiration");
|
b.Property<string>("Description")
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("Expiration")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("SessionId")
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
b.Property<string>("SubjectId")
|
b.Property<string>("SubjectId")
|
||||||
.HasMaxLength(200);
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
b.Property<string>("Type")
|
b.Property<string>("Type")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(50);
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("nvarchar(50)");
|
||||||
|
|
||||||
b.HasKey("Key");
|
b.HasKey("Key");
|
||||||
|
|
||||||
|
b.HasIndex("Expiration");
|
||||||
|
|
||||||
b.HasIndex("SubjectId", "ClientId", "Type");
|
b.HasIndex("SubjectId", "ClientId", "Type");
|
||||||
|
|
||||||
|
b.HasIndex("SubjectId", "SessionId", "Type");
|
||||||
|
|
||||||
b.ToTable("PersistedGrants");
|
b.ToTable("PersistedGrants");
|
||||||
});
|
});
|
||||||
#pragma warning restore 612, 618
|
#pragma warning restore 612, 618
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
using IdentityServer4.Models;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels
|
|
||||||
{
|
|
||||||
public record ConsentViewModel : ConsentInputModel
|
|
||||||
{
|
|
||||||
public ConsentViewModel(ConsentInputModel model, string returnUrl, AuthorizationRequest request, Client client, Resources resources)
|
|
||||||
{
|
|
||||||
RememberConsent = model?.RememberConsent ?? true;
|
|
||||||
ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty<string>();
|
|
||||||
|
|
||||||
ReturnUrl = returnUrl;
|
|
||||||
|
|
||||||
ClientName = client.ClientName;
|
|
||||||
ClientUrl = client.ClientUri;
|
|
||||||
ClientLogoUrl = client.LogoUri;
|
|
||||||
AllowRememberConsent = client.AllowRememberConsent;
|
|
||||||
|
|
||||||
IdentityScopes = resources.IdentityResources.Select(x => new ScopeViewModel(x, ScopesConsented.Contains(x.Name) || model == null)).ToArray();
|
|
||||||
ResourceScopes = resources.ApiResources.SelectMany(x => x.Scopes).Select(x => new ScopeViewModel(x, ScopesConsented.Contains(x.Name) || model == null)).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ClientName { get; init; }
|
|
||||||
public string ClientUrl { get; init; }
|
|
||||||
public string ClientLogoUrl { get; init; }
|
|
||||||
public bool AllowRememberConsent { get; init; }
|
|
||||||
|
|
||||||
public IEnumerable<ScopeViewModel> IdentityScopes { get; init; }
|
|
||||||
public IEnumerable<ScopeViewModel> ResourceScopes { get; init; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public record ScopeViewModel
|
|
||||||
{
|
|
||||||
public ScopeViewModel(Scope scope, bool check)
|
|
||||||
{
|
|
||||||
Name = scope.Name;
|
|
||||||
DisplayName = scope.DisplayName;
|
|
||||||
Description = scope.Description;
|
|
||||||
Emphasize = scope.Emphasize;
|
|
||||||
Required = scope.Required;
|
|
||||||
Checked = check || scope.Required;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScopeViewModel(IdentityResource identity, bool check)
|
|
||||||
{
|
|
||||||
Name = identity.Name;
|
|
||||||
DisplayName = identity.DisplayName;
|
|
||||||
Description = identity.Description;
|
|
||||||
Emphasize = identity.Emphasize;
|
|
||||||
Required = identity.Required;
|
|
||||||
Checked = check || identity.Required;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name { get; init; }
|
|
||||||
public string DisplayName { get; init; }
|
|
||||||
public string Description { get; init; }
|
|
||||||
public bool Emphasize { get; init; }
|
|
||||||
public bool Required { get; init; }
|
|
||||||
public bool Checked { get; init; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,7 @@
|
|||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels
|
||||||
|
{
|
||||||
|
public class RedirectViewModel
|
||||||
|
{
|
||||||
|
public string RedirectUrl { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels
|
||||||
|
{
|
||||||
|
public class ConsentInputModel
|
||||||
|
{
|
||||||
|
public string Button { get; set; }
|
||||||
|
public IEnumerable<string> ScopesConsented { get; set; }
|
||||||
|
public bool RememberConsent { get; set; }
|
||||||
|
public string ReturnUrl { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels
|
||||||
|
{
|
||||||
|
public class ConsentOptions
|
||||||
|
{
|
||||||
|
public static bool EnableOfflineAccess = true;
|
||||||
|
public static string OfflineAccessDisplayName = "Offline Access";
|
||||||
|
public static string OfflineAccessDescription = "Access to your applications and resources, even when you are offline";
|
||||||
|
|
||||||
|
public static readonly string MustChooseOneErrorMessage = "You must pick at least one permission";
|
||||||
|
public static readonly string InvalidSelectionErrorMessage = "Invalid selection";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels
|
||||||
|
{
|
||||||
|
public class ConsentViewModel : ConsentInputModel
|
||||||
|
{
|
||||||
|
public string ClientName { get; set; }
|
||||||
|
public string ClientUrl { get; set; }
|
||||||
|
public string ClientLogoUrl { get; set; }
|
||||||
|
public bool AllowRememberConsent { get; set; }
|
||||||
|
|
||||||
|
public IEnumerable<ScopeViewModel> IdentityScopes { get; set; }
|
||||||
|
public IEnumerable<ScopeViewModel> ApiScopes { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
using IdentityServer4.Models;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels
|
||||||
|
{
|
||||||
|
public class ProcessConsentResult
|
||||||
|
{
|
||||||
|
public bool IsRedirect => RedirectUri != null;
|
||||||
|
public string RedirectUri { get; set; }
|
||||||
|
public Client Client { get; set; }
|
||||||
|
|
||||||
|
public bool ShowView => ViewModel != null;
|
||||||
|
public ConsentViewModel ViewModel { get; set; }
|
||||||
|
|
||||||
|
public bool HasValidationError => ValidationError != null;
|
||||||
|
public string ValidationError { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels
|
||||||
|
{
|
||||||
|
public class ScopeViewModel
|
||||||
|
{
|
||||||
|
public string Value { get; set; }
|
||||||
|
public string DisplayName { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public bool Emphasize { get; set; }
|
||||||
|
public bool Required { get; set; }
|
||||||
|
public bool Checked { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -147,6 +147,9 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API
|
|||||||
app.Use(async (context, next) =>
|
app.Use(async (context, next) =>
|
||||||
{
|
{
|
||||||
context.Response.Headers.Add("Content-Security-Policy", "script-src 'unsafe-inline'");
|
context.Response.Headers.Add("Content-Security-Policy", "script-src 'unsafe-inline'");
|
||||||
|
context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
|
||||||
|
context.Response.Headers.Add("Access-Control-Allow-Headers", "*");
|
||||||
|
context.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
|
||||||
await next();
|
await next();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,82 +1,104 @@
|
|||||||
@model Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels.ConsentViewModel
|
@model Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels.ConsentViewModel
|
||||||
|
|
||||||
<div class="container page-consent">
|
<div class="page-consent">
|
||||||
<div class="row page-header">
|
<div class="lead">
|
||||||
<div class="col-sm-10">
|
@if (Model.ClientLogoUrl != null)
|
||||||
@if (Model.ClientLogoUrl != null)
|
{
|
||||||
{
|
<div class="client-logo"><img src="@Model.ClientLogoUrl"></div>
|
||||||
<div class="client-logo"><img src="@Model.ClientLogoUrl"></div>
|
}
|
||||||
}
|
<h1>
|
||||||
<h1>
|
@Model.ClientName
|
||||||
@Model.ClientName
|
<small class="text-muted">is requesting your permission</small>
|
||||||
<small>is requesting your permission</small>
|
</h1>
|
||||||
</h1>
|
<p>Uncheck the permissions you do not wish to grant.</p>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<partial name="_ValidationSummary"/>
|
<partial name="_ValidationSummary" />
|
||||||
|
</div>
|
||||||
<form asp-action="Index" class="consent-form">
|
</div>
|
||||||
<input type="hidden" asp-for="ReturnUrl" />
|
|
||||||
|
|
||||||
<div>Uncheck the permissions you do not wish to grant.</div>
|
|
||||||
|
|
||||||
|
<form asp-action="Index">
|
||||||
|
<input type="hidden" asp-for="ReturnUrl" />
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-8">
|
||||||
@if (Model.IdentityScopes.Any())
|
@if (Model.IdentityScopes.Any())
|
||||||
{
|
{
|
||||||
<div class="panel panel-default consent-buttons">
|
<div class="form-group">
|
||||||
<div class="panel-heading">
|
<div class="card">
|
||||||
<span class="glyphicon glyphicon-user"></span>
|
<div class="card-header">
|
||||||
Personal Information
|
<span class="glyphicon glyphicon-user"></span>
|
||||||
|
Personal Information
|
||||||
|
</div>
|
||||||
|
<ul class="list-group list-group-flush">
|
||||||
|
@foreach (var scope in Model.IdentityScopes)
|
||||||
|
{
|
||||||
|
<partial name="_ScopeListItem" model="@scope" />
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
|
||||||
@foreach (var scope in Model.IdentityScopes)
|
|
||||||
{
|
|
||||||
<partial name="_ScopeListItem" model="scope"/>
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (Model.ResourceScopes.Any())
|
@if (Model.ApiScopes.Any())
|
||||||
{
|
{
|
||||||
<div class="panel panel-default">
|
<div class="form-group">
|
||||||
<div class="panel-heading">
|
<div class="card">
|
||||||
<span class="glyphicon glyphicon-tasks"></span>
|
<div class="card-header">
|
||||||
Application Access
|
<span class="glyphicon glyphicon-tasks"></span>
|
||||||
|
Application Access
|
||||||
|
</div>
|
||||||
|
<ul class="list-group list-group-flush">
|
||||||
|
@foreach (var scope in Model.ApiScopes)
|
||||||
|
{
|
||||||
|
<partial name="_ScopeListItem" model="scope" />
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
|
||||||
@foreach (var scope in Model.ResourceScopes)
|
|
||||||
{
|
|
||||||
<partial name="_ScopeListItem" model="scope"/>
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<span class="glyphicon glyphicon-tasks"></span>
|
||||||
|
Description
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<input class="form-control" placeholder="Description or name of device" asp-for="Description" autofocus>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
@if (Model.AllowRememberConsent)
|
@if (Model.AllowRememberConsent)
|
||||||
{
|
{
|
||||||
<div class="consent-remember">
|
<div class="form-group">
|
||||||
<label>
|
<div class="form-check">
|
||||||
<input class="consent-scopecheck" asp-for="RememberConsent" />
|
<input class="form-check-input" asp-for="RememberConsent">
|
||||||
<strong>Remember My Decision</strong>
|
<label class="form-check-label" asp-for="RememberConsent">
|
||||||
</label>
|
<strong>Remember My Decision</strong>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
</div>
|
||||||
<div class="consent-buttons">
|
|
||||||
<button name="button" value="yes" class="btn btn-primary" autofocus>Yes, Allow</button>
|
|
||||||
<button name="button" value="no" class="btn">No, Do Not Allow</button>
|
|
||||||
@if (Model.ClientUrl != null)
|
|
||||||
{
|
|
||||||
<a class="pull-right btn btn-default" target="_blank" href="@Model.ClientUrl">
|
|
||||||
<span class="glyphicon glyphicon-info-sign"></span>
|
|
||||||
<strong>@Model.ClientName</strong>
|
|
||||||
</a>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<button name="button" value="yes" class="btn btn-primary" autofocus>Yes, Allow</button>
|
||||||
|
<button name="button" value="no" class="btn btn-secondary">No, Do Not Allow</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 col-lg-auto">
|
||||||
|
@if (Model.ClientUrl != null)
|
||||||
|
{
|
||||||
|
<a class="btn btn-outline-info" href="@Model.ClientUrl">
|
||||||
|
<span class="glyphicon glyphicon-info-sign"></span>
|
||||||
|
<strong>@Model.ClientName</strong>
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
@ -1,19 +1,19 @@
|
|||||||
@model Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels.ScopeViewModel
|
@model Microsoft.eShopOnContainers.Services.Identity.API.Models.ConsentViewModels.ScopeViewModel
|
||||||
|
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
<label>
|
<label>
|
||||||
<input class="consent-scopecheck"
|
<input class="consent-scopecheck"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="ScopesConsented"
|
name="ScopesConsented"
|
||||||
id="scopes_@Model.Name"
|
id="scopes_@Model.Value"
|
||||||
value="@Model.Name"
|
value="@Model.Value"
|
||||||
checked="@Model.Checked"
|
checked="@Model.Checked"
|
||||||
disabled="@Model.Required" />
|
disabled="@Model.Required" />
|
||||||
@if (Model.Required)
|
@if (Model.Required)
|
||||||
{
|
{
|
||||||
<input type="hidden"
|
<input type="hidden"
|
||||||
name="ScopesConsented"
|
name="ScopesConsented"
|
||||||
value="@Model.Name" />
|
value="@Model.Value" />
|
||||||
}
|
}
|
||||||
<strong>@Model.DisplayName</strong>
|
<strong>@Model.DisplayName</strong>
|
||||||
@if (Model.Emphasize)
|
@if (Model.Emphasize)
|
||||||
@ -28,7 +28,7 @@
|
|||||||
@if (Model.Description != null)
|
@if (Model.Description != null)
|
||||||
{
|
{
|
||||||
<div class="consent-description">
|
<div class="consent-description">
|
||||||
<label for="scopes_@Model.Name">@Model.Description</label>
|
<label for="scopes_@Model.Value">@Model.Description</label>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</li>
|
</li>
|
Loading…
x
Reference in New Issue
Block a user