我是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。
感谢。
答案 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
否则你必须以某种方式包装它。