IdentityServer4 - 如何使用 mysql.data 将刷新令牌存储到数据库中?

IdentityServer4 - How to store refresh token into database using mysql.data?

我是 IdentityServer4 的新手。我读到我需要实现一个 IPersistedGrantStore 来将刷新令牌存储到 table 中,例如我数据库中的 PersistedGrants

当我的本机应用程序请求新的访问令牌时,IdentityServer 日志如下:"refresh_token" grant with value: "{value}" not found in store.

那是因为我使用的是持久授权存储的内存版本。所以我需要将刷新令牌存储在 PersistedGrant table.

因此 在我的 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.csclass

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 class 编写代码。 但问题是:一旦我为 PersistedGrantStore.cs class 编写了代码,我在哪里调用 PersistedGrantStore.cs class?在Identity.ServerAccount/AccountController?我没有找到任何不使用 EntityFramework 的例子,因为我不想使用 Entity Framework.

谢谢。

关键是使用您喜欢的任何后端来实现 IPersistedGrantStore,然后通过在依赖注入系统中注册实现来告诉 IdentityServer 使用该实现。

例如,如果您调用您的实现 PersistedGrantStore,那么您可以像这样注册该实现:

services.AddTransient<IPersistedGrantStore, PersistedGrantStore>();

你可以看到,一旦你拿走了所有 EntityFramework 的东西,基本上这就是 the EntityFramework implementation does 的全部内容。

稍后当 IdentityServer 想要保留授权时,它会获取您的实现并调用适当的方法。所以你不需要任何事情,除了将你的实现注入到 IdentityServer 以便它可以做任何需要的事情。

我知道这个问题有点老了,你可能已经找到了问题所在。我认为你唯一的错误是你发明了自己的接口而不是实现:

IdentityServer4.Stores.IPersistedGrantStore

如果您想使用自己的 CustomPersistedGrant,它应该派生自:

IdentityServer4.Models.PersistedGrant

否则你将不得不以某种方式包装它。