Я пытаюсь расширить сущности, используемые OpenIddict, на основе приведенного здесь примера: https://github.com/openiddict/openiddict-core/issues/360#issuecomment-280268525
Это включает в себя создание классов сущностей, расширяющих классы, заданные OpenIddict:
public class CustomApplication : OpenIddictApplication<Guid, CustomAuthorization, CustomToken>
{
public string ImpersonateUser { get; set; }
}
public class CustomAuthorization : OpenIddictAuthorization<Guid, CustomApplication, CustomToken>
{
}
public class CustomScope : OpenIddictScope<Guid>
{
}
public class CustomToken : OpenIddictToken<Guid, CustomApplication, CustomAuthorization>
{
}
Обновление AddDbContext
:
services.AddDbContext<ApplicationContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("ConnectionString"));
options.UseOpenIddict<CustomApplication, CustomAuthorization, CustomScope, CustomToken, Guid>();
});
И модифицированная версия вызова для регистрации служб, чтобы соответствовать более новому API:
services.AddOpenIddict()
.AddCore(options =>
{
options.UseEntityFrameworkCore().UseDbContext<ApplicationContext>()
.ReplaceDefaultEntities<CustomApplication, CustomAuthorization, CustomScope, CustomToken, Guid>();
})
Все выглядит хорошо до этого момента.Затем, как часть запуска приложения, я проверяю существующий клиент и создаю его, если он не найден:
var manager = serviceScope.ServiceProvider.GetRequiredService<OpenIddictApplicationManager<CustomApplication>>();
if (await manager.FindByClientIdAsync("Application") == null) // Throws Here
{
var descriptor = new OpenIddictApplicationDescriptor
{
ClientId = "Application",
ClientSecret = "application-default-secret",
DisplayName = "Application",
RedirectUris = { new Uri("http://localhost:5000/signin-oidc")},
Permissions = { OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.Endpoints.Logout,
OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Profile,
OpenIddictConstants.Permissions.Scopes.Roles}
};
await manager.CreateAsync(descriptor);
}
Как отмечено в комментарии «Throws Here», генерируется исключение, которое является SqlException:
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (9ms) [Parameters=[@__identifier='Application' (Size = 100)], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [application].[Id], [application].[ClientId], [application].[ClientSecret], [application].[ConcurrencyToken], [application].[ConsentType], [application].[DisplayName], [application].[ImpersonateUser], [application].[Permissions], [application].[PostLogoutRedirectUris], [application].[Properties], [application].[RedirectUris], [application].[Type]
FROM [OpenIddictApplications] AS [application]
WHERE [application].[ClientId] = @__identifier
System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'ImpersonateUser'.
Появляется где-то по пути, он пытается запросить старые таблицы вместо новых, которые я указываю.Единственные вещи в стеке вызовов для OpenIddict между моим начальным методом и исключением SQL являются OpenIddict.Core.OpenIddictApplicationManager`1.FindByClientIdAsync(String identifier, CancellationToken cancellationToken)
и OpenIddict.Core.OpenIddictApplicationCache`1.<>c__DisplayClass6_0.<<FindByClientIdAsync>g__ExecuteAsync|0>d.MoveNext()