Получил это для работы с Oracle.EntityFrameworkCore (2.19.0-бета4). Пара вещей, которые я узнал по пути:
1) Многие экземпляры Oracle придерживаются стандарта SQL-92, который ограничивает объекты (включая имена таблиц и столбцов) до 30 символов; несколько имен по умолчанию IdentityServer4
Имена столбцов таблицы «Клиент» превышают 30 символов. Миграция EF была изменена для адаптации ограничения на количество символов в имени столбца.
b.Property<bool>("AlwaysIncludeUserClaimsInIdToken")
.HasColumnName("AlwaysIncludeUserClaimsInIdTok");
2) Oracle обрабатывает инкрементные первичные ключи иначе, чем SQLServer. Свойство EF миграции Oracle:ValueGenerationStrategy
используется для всех первичных ключей.
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasAnnotation("Oracle:ValueGenerationStrategy", OracleValueGenerationStrategy.IdentityColumn);
3) Имена таблиц Oracle не чувствительны к регистру, если они созданы в верхнем регистре; если они созданы в смешанном регистре, они чувствительны к регистру. Мне удалось заставить IdentityServer4
работать с Oracle, используя имена таблиц по умолчанию IdentityServer4
. Однако я решил изменить имена таблиц на все прописные, изменив свойства EF на прописные:
migrationBuilder.CreateTable(name: "IS4_CLIENT",
b.ToTable("IS4_CLIENT"),
principalTable: "IS4_CLIENT",
Свойства хранилища конфигурации IdentityServer4
необходимо изменить, чтобы они соответствовали измененным именам таблиц в верхнем регистре. Ниже приведен класс расширения, который использовался для настройки IdentityServer4
AddConfigurationStore
и AddOperationalStore
.
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Oracle.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using IdentityServer4.EntityFramework.Entities;
namespace is4ef.Extensions
{
public static class Is4BuilderExtensions
{
public static string IdentityResource { get; private set; }
public static IIdentityServerBuilder AddIs4ConfigurationStore(
this IIdentityServerBuilder builder, string connectionString)
{
string assemblyNamespace = typeof(Is4BuilderExtensions)
.GetTypeInfo()
.Assembly
.GetName()
.Name;
builder
.AddConfigurationStore(options => {
options.ConfigureDbContext = b =>
b.UseOracle(connectionString, optionsBuilder =>
optionsBuilder.MigrationsAssembly(assemblyNamespace)
.UseOracleSQLCompatibility("12"));
options.DefaultSchema = "X13663";
options.ApiClaim.Name = "IS4_AIPCLAIM";
options.ApiResourceProperty.Name = "IS4_APIPROPERTY";
options.ApiResource.Name = "IS4_APIRESOURCE";
options.ApiScopeClaim.Name = "IS4_APISCOPECLAIM";
options.ApiScope.Name = "IS4_APISCOPE";
options.ApiSecret.Name = "IS4_APISECRET";
options.ClientClaim.Name = "IS4_CLIENTCLAIM";
options.ClientCorsOrigin.Name = "IS4_CLIENTCORSORIGIN";
options.ClientGrantType.Name = "IS4_CLIENTGRANTTYPE";
options.ClientIdPRestriction.Name = "IS4_CLIENTIDPRESTRICTION";
options.ClientPostLogoutRedirectUri.Name = "IS4_CLIENTPOSTLOGOUTREDIRECTURI";
options.ClientProperty.Name = "IS4_CLIENTPROPERTY";
options.ClientRedirectUri.Name = "IS4_CLIENTREDIRECTURI";
options.Client.Name = "IS4_CLIENT";
options.ClientScopes.Name = "IS4_CLIENTSCOPE";
options.ClientSecret.Name = "IS4_CLIENTSECRET";
options.IdentityClaim.Name = "IS4_IDENTITYCLAIM";
options.IdentityResourceProperty.Name = "IS4_IDENTITYPROPERTY";
options.IdentityResource.Name = "IS4_IDENTITYRESOURCE";
})
.AddOperationalStore(options => {
options.ConfigureDbContext = b =>
b.UseOracle(connectionString, optionsBuilder =>
optionsBuilder.MigrationsAssembly(assemblyNamespace)
.UseOracleSQLCompatibility("12"));
options.DefaultSchema = "X13663";
options.DeviceFlowCodes.Name = "IS4_DEVICECODE";
options.PersistedGrants.Name = "IS4_PERSISTEDGRANT";
});
return builder;
}
}
}