猿问

如何使用 T-SQL 插入 Identity Server 4 持久的 ApiSecret 值

我已经通过 Identity Server 4 QuickStart 使用实体框架来持久存储配置和操作数据。在快速入门中,ApiResources 以代码的形式加载到数据库中。Api 秘密设置为

        new ApiResource("api1", "My API")
        {
            ApiSecrets = { new Secret("secret".Sha256())}
        }

在 ApiResource 构造函数中。当在 Startup.InitializeDatabase 中将该 ApiResource 添加到 ConfigurationDbContext.ApiResources DbSet 时,

        foreach(var resource in Config.GetApiResources())
        {
            context.ApiResources.Add(resource.ToEntity());
        }
        context.SaveChanges();

子 ApiSecrets 表中的记录在 ApiSecrets.Value 字段中包含可读的文本值。

    K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=

我想通过 SQL 脚本管理我的配置数据,但我不知道如何正确设置 ApiSecrets.Value。我试过使用 T-SQL HASHBYTES('SHA2_256', 'secret'),但这会在 ApiSecrets.Value 中产生一个不可读的(我认为是二进制的)值。有没有办法通过 T-SQL 正确设置散列秘密?


犯罪嫌疑人X
浏览 130回答 3
3回答

12345678_0001

你在正确的轨道上使用HASHBYTES,只需要得到Base64散列BinaryHash:DECLARE @HASHBYTES VARBINARY(128) = hashbytes('sha2_256', 'secret')SELECT cast(N'' as xml).value('xs:base64Binary(sql:variable("@HASHBYTES"))', 'varchar(128)');

一只萌萌小番薯

希望这会有所帮助。CREATE FUNCTION [dbo].[ConvertToSha256ForIdentityServer](@secret varchar(128))RETURNS varchar(128) ASBEGIN    DECLARE @HASHBYTES VARBINARY(128) = hashbytes('sha2_256', @secret)    RETURN (SELECT top 1 cast(N'' as xml).value('xs:base64Binary(sql:variable("@HASHBYTES"))', 'varchar(128)'));END插入MERGE INTO dbo.[ClientSecrets] AS TARGETUSING (        VALUES         (dbo.ConvertToSha256ForIdentityServer('mysecret'),'SharedSecret',getdate(),1)      )      AS Source ([Value],[Type],[Created],[ClientId])ON Target.[ClientId] = source.[ClientId]WHEN matched THEN  UPDATE SET      [Value] = Source.[Value],      [Type] = Source.[Type]WHEN NOT matched BY target THEN  INSERT ([Value],[Type],[Created],[ClientId])  VALUES ([Value],[Type],[Created],[ClientId]);

侃侃尔雅

您可以使用下面的算法来创建秘密,然后您可以将其存储在 SQL 中: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());}你也可以使用passwordgenerator.net
随时随地看视频慕课网APP
我要回答