为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
犯罪嫌疑人X 2022-07-23 18:00:19
我已经通过 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 正确设置散列秘密?
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

你在正确的轨道上使用HASHBYTES,只需要得到Base64散列BinaryHash:


DECLARE @HASHBYTES VARBINARY(128) = hashbytes('sha2_256', 'secret')

SELECT cast(N'' as xml).value('xs:base64Binary(sql:variable("@HASHBYTES"))', 'varchar(128)');


查看完整回答
反对 回复 2022-07-23
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

希望这会有所帮助。


CREATE FUNCTION [dbo].[ConvertToSha256ForIdentityServer](@secret varchar(128))

RETURNS varchar(128) AS

BEGIN

    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 TARGET

USING (

        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]);


查看完整回答
反对 回复 2022-07-23
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您可以使用下面的算法来创建秘密,然后您可以将其存储在 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


查看完整回答
反对 回复 2022-07-23
  • 3 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信