2017-05-16 135 views
0

当前正在尝试构建一个单一的登录服务器为几个客户端使用。因为我不完全知道,有多少个客户端,我计划完成,因此我可以使用EntityFramework配置存储在运行时添加客户端。IdentityServer4存储客户端密码

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

我认为这是故意的,它不鼓励保存普通版的秘密?什么是保存秘密的解决方案?

在此先感谢!

+0

你不应该保存明文秘密。你为什么想要访问纯文本的秘密? – moritzg

+0

我想自动生成它们,然后我需要将它们读到某处,以便我可以将它们添加到我的应用程序中。这将是与例如Facebook oauth2相同的工作流程。你去开发者页面,创建一个应用程序(这里是客户端),然后可以读取秘密并将其添加到您的应用程序。为此我需要将它们存储在普通的地方? – fbrthld

+0

这些是您自己的应用程序吗? – moritzg

回答

1

使用以下算法生成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()); 
} 
+0

谢谢你的回答,但那不是我遇到的问题。我可以创建散列并保存散列的秘密。我想要做的事情实际上是以明文保存秘密,以便日后可以阅读。我想知道这是不应该的,因为在身份服务器4中无法使用自定义数据库表等等 – fbrthld

+1

您最好生成秘密,并立即将其提供给所有者,而不要将其存储在纯文本中。以纯文本保存秘密是一个禁忌。无论如何,如果您确实需要稍后访问它,请使用您自己的带有客户端ID的表格进行秘密映射。在存储和解密密码之前,您应该尽力加密密码,而不是以明文形式存储密码。 – rawel

+0

姆姆。这可能是一个解决方案。我想我会在秘密世代中将它交给用户,而不是永久保存。感谢您的输入! – fbrthld

0

您不应该以纯文本格式存储客户端密钥。

总是假定你的配置数据库被攻破 - 然后这些秘密可以用来冒充你的客户端。

这对您来说可能会稍微不方便 - 但这是一种最佳做法(也符合其他令牌服务处理该问题的方式)。

如果你在休息保护秘密的其他方式 - 您可以在纯文本基于秘密验证添加到DI

https://github.com/IdentityServer/IdentityServer4/blob/dev/src/IdentityServer4/Validation/PlainTextSharedSecretValidator.cs