我在我们的web应用程序中实现了IdentityServer3。我使用来自db的LocalRegistrationUserService和客户端的自定义登录。到目前为止,它工作得很好。
我的下一个任务是将访问令牌存储到数据库中。我看过IdentityServer3.EntityFramework源代码(https://github.com/IdentityServer/IdentityServer3.EntityFramework),它看起来有很多东西,外加SQL表。
我的问题是,我需要所有的源代码和SQL表吗?我只想存储令牌并能够加载它们。还有,有没有人不用EntityFramework就做到了呢?如果谁有样品,请分享。谢谢。
ps:我不得不将它转换成VB,这是一件痛苦的事情
发布于 2016-08-19 01:27:45
根据您的描述,您似乎打算将客户端和作用域保留在内存中,但将所有令牌和流数据持久化。
要支持标准的OIDC流,您绝对需要的不仅仅是TokenHandleStore。除了ConsentStore之外,每个可操作的存储都是必不可少的。只有当您的客户端永远不会提示用户同意作用域时,此选项才是可选的。如果您只想支持一个或多个流的子集,那么您可以使用less,但这取决于所涉及的流。出于可扩展性、继承性和一致性的考虑,您可能希望拥有一组功能齐全的操作存储。
因此,可以选择在启动时引入IdentityServer3.EntityFramework package并使用RegisterOperationalServices扩展方法,或者自己编写可操作的存储。自己编写它会有一些好处,因为它提供了对所有OIDC流程的一些很好的洞察。您也不受EntityFramework的限制,可以自由选择您的数据访问方法。
我自己编写了运营商店,不包括ConsentStore。该模式与IdentityServer3.EntityFramework中的模式有很大不同,但两者具有相同的用途:

发布于 2018-12-06 16:56:58
答案是ITokenHandleStore。实现此接口将使您在自己的数据库中保存令牌。请按照以下步骤操作。
步骤1.了解负责的接口。
ITokenHandleStore本身没有任何签名。
public interface ITokenHandleStore : ITransientDataRepository<Token>
{
}取而代之的是ITransientDataRepository<T>。
public interface ITransientDataRepository<T> where T : ITokenMetadata
{
//
// Retrieves all data for a subject identifier.
//
// subject:
// The subject identifier.
//
// A list of token metadata
Task<IEnumerable<ITokenMetadata>> GetAllAsync(string subject);
//
// Retrieves the data.
//
// key:
// The key.
Task<T> GetAsync(string key);
//
// Removes the data.
//
// key:
// The key.
Task RemoveAsync(string key);
//
// Revokes all data for a client and subject id combination.
//
// subject:
// The subject.
//
// client:
// The client.
Task RevokeAsync(string subject, string client);
//
// Stores the data.
//
// key:
// The key.
//
// value:
// The value.
Task StoreAsync(string key, T value);
}步骤2.界面概述。
这是我从VisualStudio中提取的接口和实现之间的层次关系

步骤3.实现您自己的令牌存储。
您现在需要做的就是创建一个实现ITokenHandleStore的类,并调整代码来访问您自己的数据库,如下所示。(这是一组伪代码。)
public class HoanMadeTokenHandleStore : ITokenHandleStore
{
public async Task<IEnumerable<ITokenMetadata>> GetAllAsync(string subject)
{
#region pseudo code
// 1. Connect to database
var db = Connection.connectDatabase("yourDatabaseConnectionString");
// 2. Select tokens
db.Query("SELECT * FROM Tokens");
db.AddWhereCondition("SubjectId", subject);
// 3. Actual Database Querying
// SELECT * FROM Tokens WHERE SubjectId = subject
var results = db.Select();
#endregion
return results.Cast<ITokenMetadata>();
}
public async Task<T> GetAsync(string key)
{
#region pseudo code
// 1. Connect to database
var db = Connection.connectDatabase("yourDatabaseConnectionString");
// 2. Select tokens
db.Query("SELECT * FROM Tokens");
db.AddWhereCondition("key", key);
// 3. Actual Database Querying
// SELECT * FROM Tokens WHERE AccessToken = key
var token = db.Select();
#endregion
return token;
}
public async Task RemoveAsync(string key)
{
#region pseudo code
// 1. Connect to database
var db = Connection.connectDatabase("yourDatabaseConnectionString");
// 2. Delete tokens
db.Query("DELETE FROM Tokens");
db.AddWhereCondition("key", key);
// 3. Actual Database Querying
// DELETE FROM Tokens WHERE AccessToken = key
var token = db.Delete();
#endregion
}
public async Task RevokeAsync(string subject, string client)
{
#region pseudo code
// 1. Connect to database
var db = Connection.connectDatabase("yourDatabaseConnectionString");
// 2. Delete tokens
db.Query("DELETE FROM Tokens");
db.AddWhereCondition("ClientId", client);
db.AddWhereCondition("SubjectId", subject);
// 3. Actual Database Querying
// DELETE FROM Tokens WHERE ClientId = client AND SubjectId = subject
var token = db.Delete();
#endregion
}
public override async Task StoreAsync(string key, Token value)
{
#region pseudo code
// 1. Connect to database
var db = Connection.connectDatabase("yourDatabaseConnectionString");
// 2. Add Token
db.Query("INSERT INTO Tokens");
db.AddValues("AccessToken", key);
db.AddValues("TokenType", value.type);
db.AddValues("LifeTime", value.LifeTime);
// and so on~
// 3. Insert a token
// INSERT 항목은 정하기 나름입니다.
// this is only an example, you can store any properties you want or you think you'd need in the future.
// INSERT INTO Tokens ( AccessToken, TokenType, LifeTime ) VALUES ( "adasdfcbe66qsa123512312", 3, 3600 );
db.Add();
#endregion
}
}步骤4.最后要做的事情
IdentityServer3使用Autofac作为其IoC容器,这意味着您必须注册自己的实现HoanMadeTokenHandleStore。您可能在使用IdentityServer3时见过此代码。
.
.
.
var factory = new IdentityServerServiceFactory();
factory.UseInMemoryUsers(Users.Get());
factory.UseInMemoryClients(Users.Get());
factory.UseInMemoryScopes(Users.Get());
.
.
.是的,这个factory是你这次应该看看的。从字面上看,这是用于处理IdentityServer3管道中的令牌和每个任务的factory。只需在初始化factory对象后添加它即可。
factory.TokenHandleStore = new Registration<ITokenHandleStore, HoanMadeTokenHandleStore>();然后,autofac将在运行时注入您的实现。你可以在你自己的实现中编写任何与数据库相关的代码。HoanMadeTokenHandleStore。Entityframework、ADO.NET、Dapper.NET或显式SqlConnection和命令,随便什么。
https://stackoverflow.com/questions/38981298
复制相似问题