首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IdentityServer3 TokenHandleStore

IdentityServer3 TokenHandleStore
EN

Stack Overflow用户
提问于 2016-08-17 01:44:33
回答 2查看 965关注 0票数 1

我在我们的web应用程序中实现了IdentityServer3。我使用来自db的LocalRegistrationUserService和客户端的自定义登录。到目前为止,它工作得很好。

我的下一个任务是将访问令牌存储到数据库中。我看过IdentityServer3.EntityFramework源代码(https://github.com/IdentityServer/IdentityServer3.EntityFramework),它看起来有很多东西,外加SQL表。

我的问题是,我需要所有的源代码和SQL表吗?我只想存储令牌并能够加载它们。还有,有没有人不用EntityFramework就做到了呢?如果谁有样品,请分享。谢谢。

ps:我不得不将它转换成VB,这是一件痛苦的事情

EN

回答 2

Stack Overflow用户

发布于 2016-08-19 01:27:45

根据您的描述,您似乎打算将客户端和作用域保留在内存中,但将所有令牌和流数据持久化。

要支持标准的OIDC流,您绝对需要的不仅仅是TokenHandleStore。除了ConsentStore之外,每个可操作的存储都是必不可少的。只有当您的客户端永远不会提示用户同意作用域时,此选项才是可选的。如果您只想支持一个或多个流的子集,那么您可以使用less,但这取决于所涉及的流。出于可扩展性、继承性和一致性的考虑,您可能希望拥有一组功能齐全的操作存储。

因此,可以选择在启动时引入IdentityServer3.EntityFramework package并使用RegisterOperationalServices扩展方法,或者自己编写可操作的存储。自己编写它会有一些好处,因为它提供了对所有OIDC流程的一些很好的洞察。您也不受EntityFramework的限制,可以自由选择您的数据访问方法。

我自己编写了运营商店,不包括ConsentStore。该模式与IdentityServer3.EntityFramework中的模式有很大不同,但两者具有相同的用途:

票数 1
EN

Stack Overflow用户

发布于 2018-12-06 16:56:58

答案是ITokenHandleStore。实现此接口将使您在自己的数据库中保存令牌。请按照以下步骤操作。

步骤1.了解负责的接口。

ITokenHandleStore本身没有任何签名。

代码语言:javascript
复制
public interface ITokenHandleStore : ITransientDataRepository<Token>
{
}

取而代之的是ITransientDataRepository<T>

代码语言:javascript
复制
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的类,并调整代码来访问您自己的数据库,如下所示。(这是一组伪代码。)

代码语言:javascript
复制
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时见过此代码。

代码语言:javascript
复制
.
.
.
var factory = new IdentityServerServiceFactory();
factory.UseInMemoryUsers(Users.Get());
factory.UseInMemoryClients(Users.Get());
factory.UseInMemoryScopes(Users.Get());
.
.
.

是的,这个factory是你这次应该看看的。从字面上看,这是用于处理IdentityServer3管道中的令牌和每个任务的factory。只需在初始化factory对象后添加它即可。

代码语言:javascript
复制
factory.TokenHandleStore = new Registration<ITokenHandleStore, HoanMadeTokenHandleStore>();

然后,autofac将在运行时注入您的实现。你可以在你自己的实现中编写任何与数据库相关的代码。HoanMadeTokenHandleStore。Entityframework、ADO.NET、Dapper.NET或显式SqlConnection和命令,随便什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38981298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档