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

时间:2017-11-15 15:17:04

标签: persistence identityserver4 refresh-token

我是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。

感谢。

2 个答案:

答案 0 :(得分:2)

关键是使用您喜欢的任何后端实现library(dplyr) library(purrr) df <- tibble(foo = 1:3, bar = letters[1:3]) map_dfr(seq_len(nrow(df)), ~{ df %>% slice(.x) %>% sample_n(size = sample(1:3, 1), replace = TRUE) }) #> # A tibble: 7 x 2 #> foo bar #> <int> <chr> #> 1 1 a #> 2 1 a #> 3 1 a #> 4 2 b #> 5 2 b #> 6 3 c #> 7 3 c ,然后通过在依赖注入系统中注册实现来告诉IdentityServer使用该实现。

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

PersistedGrantStore

一旦你拿走了所有的EntityFramework内容,你就会发现基本上就是the EntityFramework implementation does

稍后当IdentityServer想要持久授权时,它将获得您的实现并调用适当的方法。因此,除了将您的实现注入IdentityServer之外,您不必执行任何事情,因此它可以完成所需的任务。

答案 1 :(得分:2)

我知道这个问题有点陈旧,你可能已经发现了问题。我认为你唯一的错误就是你发明了自己的界面而不是实现:

IdentityServer4.Stores.IPersistedGrantStore

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

IdentityServer4.Models.PersistedGrant

否则你必须以某种方式包装它。