Использование пользовательских объектов с OpenIddict - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь расширить сущности, используемые 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()

...