Пользовательские зависимости UserRepository для IdentityServer4 не разрешены - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь сделать один шаг после учебников по IdentityServer4 в направлении системы, которую я могу использовать.У меня есть пользовательская база данных, разработанная для IdS3, которую я хочу продолжать использовать.Моя цель - интегрировать базу данных SQL Server для UserStore с IdS4, но без использования Entity Framework.Я хочу использовать операции ADO.NET вместо этого.Я бы обработал кратковременные ошибки с помощью «ReliableSqlConnection», используя Polly для управления логикой повторения.

При запуске у меня есть ConfigureService как:

public void ConfigureServices(IServiceCollection services)
{
  IEnumerable<Client> clients = Clients.Get();
  IEnumerable<IdentityResource> identityResources = Resources.GetIdentityResources();
  IEnumerable<ApiResource> apiResources = Resources.GetApiResources();
  services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryIdentityResources(identityResources)
    .AddInMemoryApiResources(apiResources)
    .AddInMemoryClients(clients)
    .AddMyUserStore();
  services.AddMvc();
}

Интересное дополнение кэтот метод за пределами учебника .AddMyUserStore () добавлен к AddIdentityServer ().Остальная часть не была перенесена из учебника для пользовательского репозитория.Расширение AddMyUserStore:

    public static IIdentityServerBuilder AddMyUserStore(this IIdentityServerBuilder builder)
    {
        builder.AddReliableConnectionToDataStore();
        builder.Services.AddSingletond<IUserRepository, UserRepository>();
        builder.Services.AddSingleton<IProvideClaims, ClaimRepository>();
        builder.AddProfileService<MyProfileService>();
        builder.AddResourceOwnerValidator<MyPasswordValidator>();
        return builder;
    }

Интересная строка здесь - builder.AddReliableConnectionToDataStore (), с кодом:

    private static void AddReliableConnectionToDataStore(this IIdentityServerBuilder builder)
    {
        const string connectionString = "server=...;";
        DbProviderFactory factory = SqlClientFactory.Instance;
        const int retryCount = 3;
        const int waitBetweenRetriesInMilliseconds = 100;
        builder
            .Services
            .AddSingleton<IProvideDbConnections>(
                s => new ReliableDbConnector(
                    connectionString,
                    factory,
                    new DatabaseCommunicationRetryPolicy(
                        retryCount,
                        waitBetweenRetriesInMilliseconds,
                        new[]
                        {
                            20, 64, 233, 4060, 4221, 10053, 10054, 10060,
                            40143, 40197, 40501, 40613, 49918, 49919, 49920
                        })));
    }

Где:

public interface IProvideDbConnections
{
    IDbConnection Connection { get; }
}

иReliableDbConnection реализует это.C'tor для UserRepository выглядит следующим образом:

    public UserRepository(IProvideDbConnections connector)
    {
        Connector = connector;
    }

Я ожидал, что, поскольку у меня есть IProvideDBConnections в DI, UserRepository будет разрешаться нормально.Я запускаю проект.На первой странице появляется.Если щелкнуть ссылку на https://localhost:44349/grants на первой странице, то произойдет ошибка:

"Произошло необработанное исключение при обработке запроса. InvalidOperationException: невозможно разрешить службу для типа« MyUserRepository.UserRepository »во время обработки запроса.попытка активировать 'IdentityServer4.Quickstart.UI.AccountController'. "

Чего мне не хватает?

ОБНОВЛЕНИЕ Контроллер учетных записей в руководстве:

    public AccountController(
        IIdentityServerInteractionService interaction,
        IClientStore clientStore,
        IAuthenticationSchemeProvider schemeProvider,
        IEventService events,
        UserRepository users)
    {
        Users = users;
        _interaction = interaction;
        _clientStore = clientStore;
        _schemeProvider = schemeProvider;
        _events = events;
    }

1 Ответ

0 голосов
/ 09 декабря 2018

Вы пытаетесь ввести конкретный тип UserRepository в свой контроллер, а не в интерфейс (IUserRepository), который вы зарегистрировали?

Кроме того, я не уверен, что регистрация сервисов, которые имеют дело с соединениями с базой данных как одиночные, является хорошей идеей, придерживайтесь переходного процесса или запрашивайте объем, если у вас нет веских причин не делать этого.

...