IdentityServer4 - Как сохранить токен обновления в базе данных с помощью mysql.data?

Я новичок в IdentityServer4. Я прочитал, что мне нужно реализовать IPersistedGrantStore для хранения токенов обновления в таблице вроде PersistedGrants в моей базе данных.

Когда мое собственное приложение запрашивает новый токен доступа, в журналах IdentityServer отображается следующее: "refresh_token" grant with value: "{value}" not found in store.

Это потому, что я использую версию постоянного хранилища грантов в памяти. Поэтому мне нужно сохранить токен обновления в PersistedGrant таблице.

Поэтому в моем startup.cs я добавил следующую строку:

builder.Services.AddScoped<IPersistedGrantStore, PersistedGrantStore>();

а IPersistedGrantStore.cs -

public interface IPersistedGrantStore
{        
    Task StoreAsync(CustomPersistedGrant grant);

    Task<CustomPersistedGrant> GetAsync(string key);

    Task<IEnumerable<CustomPersistedGrant>> GetAllAsync(string subjectId);        
}

Итак, у меня есть класс CustomPersistedGrant.cs

public class CustomPersistedGrant
{
    public string Key { get; set; }

    public string Type { get; set; }

    public string SubjectId { get; set; }

    public string ClientId { get; set; }

    public DateTime CreationTime { get; set; }

    public DateTime? Expiration { get; set; }

    public string Data { get; set; }
}

и теперь мне нужно написать код для моего класса PersistedGrantStore.cs. Но возникает вопрос: как только я напишу код для класса PersistedGrantStore.cs, в котором я вызываю класс PersistedGrantStore.cs? В Identity.Server Account/AccountController? Я не нашел ни одного примера об этом без использования EntityFramework, потому что я не хочу использовать Entity Framework.

Спасибо.


person Mini Dev 1    schedule 15.11.2017    source источник


Ответы (2)


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

Например, если вы вызываете свою реализацию PersistedGrantStore, вы можете зарегистрировать реализацию следующим образом:

services.AddTransient<IPersistedGrantStore, PersistedGrantStore>();

Вы можете видеть, что по сути это все, что реализация EntityFramework делает, как только вы уберете все элементы EntityFramework.

Позже, когда IdentityServer захочет сохранить грант, он получит вашу реализацию и вызовет соответствующий метод. Таким образом, вам не нужно ничего делать, кроме как внедрить свою реализацию в IdentityServer, чтобы он мог делать то, что необходимо.

person Jim Counts    schedule 16.11.2017
comment
Спасибо. В моем startup.cs я зарегистрировал реализацию с этой строкой: builder.Services.AddScoped<IPersistedGrantStore, PersistedGrantStore>();. Моя цель - сохранить грант, но где код для сохранения гранта с использованием IPersistedGrantStore и моего PersistedGrantStore в IdentityServer4. Я не нашел ссылки в проекте QuickStartIdentityServer на github - person Mini Dev 1; 16.11.2017
comment
Это внутренний вызов IdentityServer. Вам не нужно вызывать хранилище PersistedGrant, как и при использовании версии InMemory. - person Jim Counts; 16.11.2017
comment
В моем PersistedGrantStore я реализовал все элементы интерфейсов и поставил точку останова в начале каждого метода в этом классе для отладки. Проблема в том, что приложение не ломается, но я не понимаю, где я делаю не так. Я настраиваю своего клиента с GrantTypes.Code, RequireConsent = false, AllowOfflineAccess = true. Я что-то упускаю? - person Mini Dev 1; 08.12.2017
comment
Привет, @Jim, я пробовал несколько раз, используя вспомогательный класс расширения, например, в этот проект или напрямую services.AddTransient<IPersistedGrantStore, PersistedGrantStore>(); в startup.cs, но первая строка журнала всегда You are using the in-memory version of the persisted grant store. Где я ошибаюсь? - person Mini Dev 1; 04.01.2018
comment
HI @ MiniDev1, Вы нашли решение для этого? У меня тоже такая же проблема. - person Jaydeep Jadav; 12.06.2019
comment
Привет @JaydeepJadav, да, вы должны использовать интерфейс IdentityServer, а не свой собственный интерфейс - person Mini Dev 1; 12.06.2019
comment
@ MiniDev1: Я использовал IdentityServer4.Stores.IPersistedGrantStore и реализовал все методы. Я также зарегистрировал строру в Startup.cs с помощью AddPersistedGrantStore<CustomPersistedGrantStore>() Но все равно не повезло. Кроме того, я не получаю никаких сообщений об ошибках, таких как You are using the in-memory version of the persisted grant store, но ни один из методов CustomPersistedGrantStore не срабатывает. Есть идеи об этом? - person Jaydeep Jadav; 12.06.2019
comment
Я использую GrantTypes = ClientCredentials - person Jaydeep Jadav; 12.06.2019
comment
С учетными данными клиента вам не нужно сохранять код авторизации, обновлять токены или получать согласие - person Mini Dev 1; 12.06.2019
comment
Да, я понимаю. Спасибо, что поделились подробной ссылкой - person Jaydeep Jadav; 26.06.2019

Я знаю, что вопрос старый, и вы, возможно, уже нашли проблему. Я думаю, ваша единственная ошибка в том, что вы придумали собственный интерфейс вместо того, чтобы реализовывать:

IdentityServer4.Stores.IPersistedGrantStore

Если вы хотите использовать свой собственный CustomPersistedGrant, он должен быть производным от:

IdentityServer4.Models.PersistedGrant

в противном случае вам пришлось бы как-то его завернуть.

person Mithrandir    schedule 04.05.2018