.net IdentityServer 4存储客户端机密

.net IdentityServer 4存储客户端机密,.net,entity-framework,identityserver4,.net,Entity Framework,Identityserver4,我目前正在尝试构建一个单点登录服务器,供几个客户端使用。因为我不知道会有多少个客户端,所以我计划在运行时使用EntityFramework配置存储添加客户端 我现在的问题是如何设置客户机密。我尝试生成一个新的GUID并将其作为一个秘密使用。现在的问题是,配置存储只想保存散列版本的机密,我需要访问纯机密以将其添加到实际的客户端应用程序中 我认为这是故意的,不鼓励保存这个秘密的简单版本?保存机密的最佳解决方案是什么?使用以下算法生成sha256哈希。这与IdentityServer4.Models.

我目前正在尝试构建一个单点登录服务器,供几个客户端使用。因为我不知道会有多少个客户端,所以我计划在运行时使用EntityFramework配置存储添加客户端

我现在的问题是如何设置客户机密。我尝试生成一个新的GUID并将其作为一个秘密使用。现在的问题是,配置存储只想保存散列版本的机密,我需要访问纯机密以将其添加到实际的客户端应用程序中


我认为这是故意的,不鼓励保存这个秘密的简单版本?保存机密的最佳解决方案是什么?

使用以下算法生成sha256哈希。这与
IdentityServer4.Models.HashExtensions
类中使用的算法相同

using System.Security.Cryptography;

static class Extentions
{

    public static string Sha256(this string input)
    {

        using (SHA256 shA256 = SHA256.Create())
        {
            byte[] bytes = Encoding.UTF8.GetBytes(input);
            return Convert.ToBase64String(((HashAlgorithm)shA256).ComputeHash(bytes));
        }
    }
}


void Main()
{
    Console.WriteLine( "secret-as-guid".Sha256());
}

您不应以纯文本形式存储客户端机密

始终假设您的配置数据库遭到破坏,然后这些机密可以用来模拟您的客户端

这可能会给您带来些许不便,但这是一种最佳实践(也与其他令牌服务的处理方式一致)

如果您有其他方法来保护静止的秘密,您可以将基于纯文本的秘密验证器添加到DI


谢谢你的回答,但这不是我的问题。我可以创建散列并保存散列的秘密。我想做的事情实际上是将秘密保存在纯文本中,以便以后阅读。我想知道这是否是您不应该做的事情,因为在Identityserver 4中,如果没有自定义的db表等,这是不可能的。您最好生成机密并立即将其提供给所有者,而不将其存储为纯文本。以纯文本保存机密是不可能的。无论如何,如果以后确实需要访问它,请使用您自己的带有客户端id的表进行机密映射。您应该在存储机密之前尽最大努力对其进行加密,并在检索时对其进行解密,而不是将机密存储在plaintext.Mhm中。这可能是一个解决办法。我想我会给用户一次秘密生成,而不是永久保存它。谢谢你的输入!不客气。另外,我应该警告您不要将guid用作秘密。此算法处理IdentityServer4 Mongo示例中的机密。您不应以明文形式保存机密。为什么要访问纯文本机密?我想自动生成它们,然后我需要在某个地方读取它们,这样我才能将它们添加到我的应用程序中。这将与Facebook oauth2的工作流程相同。您进入开发者页面,创建一个应用程序(这里是客户端),然后可以读取该秘密并将其添加到您的应用程序中。为此,我需要将它们存储在某个普通的地方?这些是您自己的应用程序吗?大部分是,但不一定。我想我只会给用户一次,当他们产生的秘密,而不是存储它们。这应该是一种省钱的访问方式这实际上是个好主意。如果你的客户丢失了一个新的秘密,你也可以生成一个新的秘密。有没有在线工具可以创建一个新的秘密?我想在添加新客户端时使用它来配置它。否则我将不得不创建一个控制台应用程序?