Использование ConfigurationDbContext в IndetityServer4 из разных API - PullRequest
0 голосов
/ 08 февраля 2019

После решения моей первоначальной проблемы с добавлением UserManager в API ( Создание пользователя с помощью IdentityServer4 из нескольких API ), которое не инициализирует IdentityServer4 (который, в свою очередь, инициализируется внутри веб-приложения, отвечающего только за регистрацию и вход в системупользователей) Я столкнулся с другой проблемой.Из того же API я хочу также получить клиенты и ресурсы из IConfigurationDbContext из IdentityServer4.

На данный момент я пытаюсь выполнить следующее: я добавляю ConfigurationDbContext при запуске API, а затем черезClientsController и ClientsRepository Я пытаюсь получить доступ к клиентам, как показано ниже.

Startup.cs

 services.AddDbContext<ApplicationDbContext>(options =>
        options.UseNpgsql(defaultConnection, db => db.MigrationsAssembly("XXXXXXX"))
    );

 services.AddDbContext<ConfigurationDbContext>(options =>
        options.UseNpgsql(defaultConnection, db => db.MigrationsAssembly("XXXXXXXX"))
    );

  services.AddIdentityCore<ApplicationUser>(options => {
        options.Password.RequireNonAlphanumeric = false;
    });
    new IdentityBuilder(typeof(ApplicationUser), typeof(IdentityRole), services)
        .AddRoleManager<RoleManager<IdentityRole>>()
        .AddSignInManager<SignInManager<ApplicationUser>>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

ClientsRepository.cs (in.DataAccess):

private readonly IConfigurationDbContext _context;
public bool AutoSaveChanges { get; set; } = true;

public ClientRepository(IConfigurationDbContext context)
{
    _context = context;
}

public Task<Client> GetClientAsync(int id)
{
    return _context.Clients
        .Include(x => x.AllowedGrantTypes)
        .Include(x => x.RedirectUris)
        .Include(x => x.PostLogoutRedirectUris)
        .Include(x => x.AllowedScopes)
        .Include(x => x.ClientSecrets)
        .Include(x => x.Claims)
        .Include(x => x.IdentityProviderRestrictions)
        .Include(x => x.AllowedCorsOrigins)
        .Include(x => x.Properties)
        .Where(x => x.Id == id)
            .SingleOrDefaultAsync();
 }

Тем не менее, я получаю следующую ошибку:

System.InvalidOperationException: Unable to resolve service for type 'IdentityServer4.EntityFramework.Interfaces.IConfigurationDbContext' while attempting to activate 'XXXXXX.Data.Repositories.ClientRepository'. 

Я предполагаю, что он снова что-то делает с запуском служб, но я не могу найтиэто.

Кто-нибудь решил что-то подобное?

Бест, Мариос.

1 Ответ

0 голосов
/ 08 февраля 2019

Просто используйте расширения ServicesCollection, которые уже есть в пакете IDS4.EFCore, если вы хотите использовать их:

        services.AddConfigurationStore(options =>
        {
            options.ConfigureDbContext = builder => builder.UseNpgsql(defaultConnection, db => db.MigrationsAssembly("XXXXXXXX"));
        });

Это добавит вам IConfigurationDbContext, чтобы позже его можно было использоватьв других службах через DI.

Используйте следующие статические методы, если вы хотите добавить его непосредственно к ServicesCollection:

    public static IServiceCollection AddConfigurationStore(this IServiceCollection services,
        Action<ConfigurationStoreOptions> storeOptionsAction = null)
    {
        return services.AddConfigurationStore<ConfigurationDbContext>(storeOptionsAction);
    }

    public static IServiceCollection AddConfigurationStore<TContext>(this IServiceCollection services,
    Action<ConfigurationStoreOptions> storeOptionsAction = null)
    where TContext : DbContext, IConfigurationDbContext
    {
        var options = new ConfigurationStoreOptions();
        services.AddSingleton(options);
        storeOptionsAction?.Invoke(options);

        if (options.ResolveDbContextOptions != null)
        {
            services.AddDbContext<TContext>(options.ResolveDbContextOptions);
        }
        else
        {
            services.AddDbContext<TContext>(dbCtxBuilder =>
            {
                options.ConfigureDbContext?.Invoke(dbCtxBuilder);
            });
        }
        services.AddScoped<IConfigurationDbContext, TContext>();

        return services;
    }
...