IdentityServer 4 с EntityFramework - получение свойств клиента? - PullRequest
0 голосов
/ 13 сентября 2018

Я использую Identity Server 4 с EntityFramework для настройки.Теперь я хочу получить текущего клиента со страницы входа в систему.Мне удалось получить идентификатор клиента из параметра обратного URL.А затем я использую ConfigurationDbContext для получения клиента из базы данных.

Но на клиенте свойство Properties всегда имеет значение null, даже если я добавляю свойство этого клиента в базу данных.

Как получить свойства для клиента?

1 Ответ

0 голосов
/ 13 сентября 2018

Вместо непосредственного использования ConfigurationDbContext в проекте IdentityServer есть удобный интерфейс, который является более абстрактным: IClientStore.Этот интерфейс сам содержит одну функцию: FindClientByIdAsync, которую можно использовать для получения Client.Client включает в себя ряд свойств, в том числе:

  • ClientName
  • LogoUri
  • Свойства

Вы можете получить экземплярIClientStore с использованием DI (я полагаю, вы уже делаете это для ConfigurationDbContext).Если у вас есть это, просто позвоните FindClientByIdAsync соответственно:

var yourClient = await clientStore.FindClientByIdAsync(clientId);

При использовании этого подхода будет заполнено Properties, как и ожидалось.


, чтобы объяснить, почемуВаш оригинальный подход не дает ожидаемых результатов, нам нужно понять, как Entity Framework Core обрабатывает загрузку связанных данных .Проще говоря, при извлечении сущности Client (это класс Client, отличный от того, который я использовал выше), свойства навигации (например,Properties) по умолчанию не заполнены, поэтому вы видите null.Я настоятельно рекомендую вам прочитать документы Загрузка связанных данных , если вас больше интересует, как это работает.

Реализация Entity Framework Core IClientStore (ClientStore)) обрабатывает эту загрузку связанных данных для вас.Вот фрагмент кода из самого источника:

public Task<Client> FindClientByIdAsync(string clientId)
{
    var client = _context.Clients
        // ...
        .Include(x => x.Properties)
        .FirstOrDefault(x => x.ClientId == clientId);

    var model = client?.ToModel();

    return Task.FromResult(model);
}

Include(x => x.Properties) - это то, что заботится о получении Properties из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...