Как я могу реализовать свой собственный ClientStore в IdentityServer4? - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу добавить несколько дополнительных столбцов (например, ClientCustomProperty ) к объекту Client в IdentityServer4 и работать с ними на моем бизнес-уровне, поэтому я создаю свой собственный магазин следующим образом:

public class MyClientStore : IClientStore
{
    public Task<IdentityServer4.Models.Client> FindClientByIdAsync(string clientId)
    {
         // ...
    }
}

Я хочу вернуть свою собственную модель с дополнительными столбцами (не IdentityServer4.Models.Client) из Магазина, но подпись IClientStore.FindClientByIdeAsyn c:

Task<IdentityServer4.Models.Client> FindClientByIdAsync(string clientId);

Я думаю, что это должно быть что-то вроде этого (Generi c):

Task<TModel> FindClientByIdAsync<TModel>(string clientId)
    where TModel: class, IClientModel /* IClientModel is in IS4 */

Что мне нужно сделать, чтобы получить мою собственную модель?

1 Ответ

1 голос
/ 06 апреля 2020

Предложения в моем комментарии являются возможными решениями. Пока вы возвращаете действительный Client или Client -обработанный объект в IS4 для FindClientByIdAsync(), вы можете хранить все, что вам нравится, против вашего Клиента.


Опция 1: производная от Client:

public MyClient : Client
{
    public string MyExtraProperty { get; set; }
}

Task<Client> FindClientByIdAsync(string clientId)
{
   MyClient result = // fetch your client here;
   return result;
}

Вариант 2: адаптироваться к Client:

public MyClient
{
    // Properties that Client requires, or can be adapted to what Client requires, here.
    // ...

    public string MyExtraProperty { get; set; }
}

Task<Client> FindClientByIdAsync(string clientId)
{
   MyClient result = // fetch your client here;
   return Adapt(result);
}

private Client Adapt(MyClient value)
{
    return // your-client-adapted-to-Client here;
}

Поскольку Client уже содержит много данных, этот параметр имеет меньший смысл, чем др.


Вариант 3: добавить к Properties:

Здесь вы добавляете свои дополнительные данные в коллекцию Client.Properties. IS4 проигнорирует это, но вы можете получить доступ к данным везде, где доступен экземпляр Client. Для этой опции не требуется пользовательский тип или даже пользовательский IClientStore; это уже поддерживается.

...