Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 管理类库的用户机密 处境_.net_Asp.net Core_.net Core_App Secret - Fatal编程技术网

.net 管理类库的用户机密 处境

.net 管理类库的用户机密 处境,.net,asp.net-core,.net-core,app-secret,.net,Asp.net Core,.net Core,App Secret,我有3个有问题的dotnet核心项目: Web API 工人服务 类库 在类库中,我有一个共享的EmailService类,我在WebAPI和Worker服务中注册该类以进行依赖注入 Web API和Worker服务项目对于我的sendgrid API密钥都具有相同的配置部分,并且它们以相同的方式使用IOOptions模式绑定到POCO。它们都使用AddScoped方法注册。但是EmailService的实际类实现在共享类库中。本地运行不会获取类库中的用户机密(这可能有意义)以及ETL用户机

我有3个有问题的dotnet核心项目:

  • Web API
  • 工人服务
  • 类库
在类库中,我有一个共享的EmailService类,我在WebAPI和Worker服务中注册该类以进行依赖注入

Web API和Worker服务项目对于我的sendgrid API密钥都具有相同的配置部分,并且它们以相同的方式使用IOOptions模式绑定到POCO。它们都使用
AddScoped
方法注册。但是EmailService的实际类实现在共享类库中。本地运行不会获取类库中的用户机密(这可能有意义)以及ETL用户机密。两个用户机密共享相同的json精确值

问题 当我为ETL项目设置用户机密并在本地运行它们时,我的send grid帐户的API密钥没有被获取,因为我认为类是在类库中定义的

我试过的
我也尝试过向类库中添加相同的用户机密,但这似乎不起作用,我假设这是因为我的类库中没有appsettings.json,这可能是不应该的。

请注意,库中不能有配置。即使它有一个DLL名称的配置文件,它也会被忽略。应用程序是那些可以并且应该拥有配置的应用程序。这两个选项中的每一个都可以有一个用于EmailService的部分,将初始化配置类(
IOptions
)并在DI容器中注册。这就是服务将得到它的方式,a

appsettings.config

{
“电子邮件服务”:
{
“somethingStatic”:“abc:
}
}
appsettings.{Env}.config

{
“电子邮件服务”:
{
“apiKey”:“xyz”:
}
}
Startup.cs:

services.Configure(context.Configuration.GetSection(EmailServiceConfig.SectionName));
EmailServiceConfig.cs

class-EmailServiceConfig
{
public const string SectionName=nameof(EmailService);
公共字符串SomethingStatic{get;set;}
公共字符串ApiKey{get;set;}
}
EmailService.cs:

公共电子邮件服务(IOPS配置)
{
}

这里的诀窍是,在3.1中,工作者服务没有显式引用asp.net nuget包或user secret nuget包,这有助于用户机密工作。但在我引用user secrets nuget包并将以下内容添加到Program.cs后,它开始工作:

首先,不需要添加由于没有任何东西可以获取这些信息,因此将用户机密保存到类库中。配置系统实际上并不关心options POCO所在的程序集,特别是因为Microsoft.Extensions.configuration(加载用户机密的位置)只与Microsoft.Extensions.options(POCO的用途)有一定的关系

因为您是通过选项模式使用配置的,所以只要将依赖项注入系统配置为正确提供配置选项的所有配置源,库中的代码就不必太担心

因此,如果您在两个数据库中遇到用户机密问题(正在执行)程序集,然后是关于如何配置这些程序集的问题。由于您有一个ASP.NET核心web应用程序和一个辅助服务,我将假设您正在为这两个项目使用host builder。在这种情况下,您不必太担心设置配置源,因为host builder附带了一个合理的默认值在开发模式中不包含用户机密

值得一提的是,如果您遇到需要将用户机密配置为配置提供程序的情况,您应该知道扩展方法通常希望您在
.csproj
文件中传入一个程序集,该程序集标识项目配置中的用户机密,然后,它将为您设置这些,并使用项目的程序集,这通常是您想要做的

正如您自己所发现的那样,存在一种方法可以防止工作人员项目模板的用户机密文件开箱即用。原因是基础项目SDK忘记处理用于标识用户项目的
MSBuild属性

幸运的是,这个问题有一个简单的解决方法:您所需要做的就是添加对
Microsoft.Extensions.Configuration.UserSecrets
包的显式引用。该包已经被
Microsoft.Extensions.Hosting
隐式引用,默认情况下该包包含在Worker项目模板中t通过显式地再次添加它,您启用了几个神奇的MSBuild位,使项目能够正确地获取用户机密

因此,您的项目模板应该如下所示:


netcoreapp3.1
fb8be4c5-1316-42a7-8c30-3a752ed21c09

如果我没弄错的话,这正是我所做的。@JakeSmith:这是我在15个微服务中使用的设置,所以它肯定能工作(包括.NET Core 2.1和3.1)。那么,请更详细地解释什么不适合你。我在我的问题中添加了更详细的内容,但从本质上说,你所说的有效是有道理的。但我正在试图弄清楚为什么我不是这样。存在一些与用户机密相关的问题,这些问题与员工服务无法开箱即用(和).所以我想知道你是否还需要做些什么来让它工作?也许你团队中的其他人做了一些你不知道的事情来让它工作…事实上,他们说这在3.0中工作,但在3.1中停止工作。你确定你的15个微服务中有一些正在使用3.1吗?