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
否则你将不得不以某种方式包装它。
我是 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
否则你将不得不以某种方式包装它。