Я пытаюсь сделать один шаг после учебников по 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;
}