Identityserver4 在Identity Server 4中,如何读取保存在数据库中的加密刷新令牌(字符串)以获取访问令牌?

Identityserver4 在Identity Server 4中,如何读取保存在数据库中的加密刷新令牌(字符串)以获取访问令牌?,identityserver4,refresh-token,Identityserver4,Refresh Token,我有一个Identity Server 4池(2台服务器),一台服务器正在发出一个访问令牌(JWT)和一个刷新令牌,刷新令牌保存在数据库表中。(PersistedGrants表)。现在,当访问令牌到期时,我想从第二台服务器读取刷新令牌,并调用RequestRefreshTokenAsync以获取一组新的令牌。。如何读取应用程序中的数据库刷新令牌?我不确定这是否是您要问的问题,但客户端中的刷新令牌通过使用我认为是从IdentityServer4的源代码提取的以下代码,被翻译到IdentitySer

我有一个Identity Server 4池(2台服务器),一台服务器正在发出一个访问令牌(JWT)和一个刷新令牌,刷新令牌保存在数据库表中。(PersistedGrants表)。现在,当访问令牌到期时,我想从第二台服务器读取刷新令牌,并调用RequestRefreshTokenAsync以获取一组新的令牌。。如何读取应用程序中的数据库刷新令牌?

我不确定这是否是您要问的问题,但客户端中的
刷新令牌
通过使用我认为是从IdentityServer4的源代码提取的以下代码,被翻译到IdentityServer4的
PersistedGrants
表上的数据库
Id
不久前的代码:

using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace HandleToKey
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("No argument provided, you may want to provide with a token handle.");
                Console.WriteLine("Usage: HandleToKey.exe [tokenHandle]");
            }
            else
            {
                var input = args.First();
                using (var sha = SHA256.Create())
                {
                    input = $"{input}:refresh_token";
                    var bytes = Encoding.UTF8.GetBytes(input);
                    var hash = sha.ComputeHash(bytes);
                    var result = Convert.ToBase64String(hash);

                    Console.WriteLine(result);
                    Console.WriteLine("Press any key to continue...");
                    Console.ReadKey();
                }
            }
        }
    }
}
使用系统;
使用System.Linq;
使用System.Security.Cryptography;
使用系统文本;
名称空间HandleToKey
{
内部课程计划
{
私有静态void Main(字符串[]args)
{
如果(参数长度<1)
{
WriteLine(“未提供参数,您可能希望提供令牌句柄。”);
WriteLine(“用法:HandleToKey.exe[tokenHandle]”;
}
其他的
{
var input=args.First();
使用(var sha=SHA256.Create())
{
输入=$“{input}:刷新\u标记”;
var bytes=Encoding.UTF8.GetBytes(输入);
var hash=sha.ComputeHash(字节);
var result=Convert.ToBase64String(散列);
控制台写入线(结果);
Console.WriteLine(“按任意键继续…”);
Console.ReadKey();
}
}
}
}
}
相关字节是using中的代码,我想(我不记得了)是用于在实际源代码中创建和查询持久授权的代码,或者类似的代码。它用
“:refresh_token”
连接输入,使用UTF8 charmap获取
字节[]
,并计算其
SHA256
哈希,然后在Base64中对其进行编码,结果应为Id

通过将字符串更改为
“:access\u token”
,而不是refresh\u token,您还可以使用access\u token引用获得相同的结果


无论如何,我只是出于调试的目的使用这个我希望您避免在生产站点上使用此代码,因为如果您让我们了解更多信息,我相信有更好的方法解决您的实际问题

我在Identity server 4中使用的代码与这里的代码类似,它将数据保存到[PersistedGrants]表中,该表有以下列[Key]、[Type]、[SubjectId]、[ClientId]、[CreationTime]、[Expiration]、[data]键列是保存刷新令牌的列。现在,我想使用这个令牌来获取一组新的令牌(在生产场景中,我不能依赖内存中的令牌)。发布的刷新令牌和数据库上的密钥不一样。这正是我的代码所做的,它将刷新令牌转换为数据库密钥。阿法克没有其他方法可以做到这一点,即:获取密钥并获得实际的刷新令牌或令牌句柄