You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在.NET Core用户机密secrets.json中存储多行RSA密钥的方案咨询

解决ASP.NET Core 3中User Secrets存储多行RSA密钥的简便方案

我之前做GitHub App开发时也碰到过这个头疼的问题,给你几个不用额外工具就能搞定的简便方法:

  • 直接在secrets.json中使用转义换行符
    JSON虽然不支持原生多行字符串,但可以用\n替代实际换行。你只需要把PEM密钥的每一行内容用\n连接成单行字符串就行。比如:

    {
      "GitHubAppSettings:RsaPrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAz...\n...\n-----END RSA PRIVATE KEY-----"
    }
    

    这种格式完全能被Configuration和Options类正常绑定,直接绑定到string类型的属性上就可以使用,不用做额外处理。

  • 用dotnet CLI命令直接导入PEM文件
    要是觉得手动转义太麻烦,直接用dotnet的用户密钥命令就能一键导入整个PEM文件。打开命令行,切换到你的ASP.NET Core项目目录,执行以下命令:

    dotnet user-secrets set "GitHubAppSettings:RsaPrivateKey" "$(cat ./path/to/your/private-key.pem)"
    

    这个命令会自动读取PEM文件内容,把换行转成\n并存到user secrets里,全程不用手动编辑JSON,特别高效。

  • 自定义类型转换器(适合坚持用数组存储的场景)
    如果你确实想用数组存储密钥各行,可以给Options类的属性加个自定义类型转换器,自动把数组拼接成完整字符串。比如先定义转换器:

    public class StringArrayToStringConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            return sourceType == typeof(string[]) || base.CanConvertFrom(context, sourceType);
        }
    
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string[] array)
            {
                return string.Join(Environment.NewLine, array);
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
    

    然后在Options的属性上标记:

    public class GitHubAppSettings
    {
        [TypeConverter(typeof(StringArrayToStringConverter))]
        public string RsaPrivateKey { get; set; }
    }
    

    这样就算secrets.json里用数组存储各行,绑定的时候也会自动拼成完整的密钥字符串。不过这个方法不如前两个简便,除非有特殊需求才用。

前两个方法我在开发GitHub App时都用过,尤其是CLI命令的方式,导入密钥快得很,完全不用折腾转义的事。

内容的提问来源于stack exchange,提问作者Jan Suchotzki

火山引擎 最新活动