Dapr + .NET Core实战(七)Secrets

新2网址大全www.22223388.com)实时更新发布最新最快最有效的新2网址和新2最新网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,新2网址大全。

什么是Secrets

应用程序通常会通过使用专用的存储来存储敏感信息,如毗邻字符串、密钥等。

通常这需要确立一个密钥存储,如Azure Key Vault、Hashicorp等,并在那里存储应用程序级其余密钥。 要接见这些密钥存储,应用程序需要导入密钥存储SDK,并使用它接见这些密钥。 这可能需要相当数目的模板代码,这些代码与应用的现实营业领域无关,因此在多云场景中,可能会使用差异厂商特定的密钥存储,这就成为一个更大的挑战。

闪开发职员在任何地方更容易接见应用程序密钥, Dapr 提供一个专用的密钥构建块 ,允许开发职员从一个存储获得密钥。

使用 Dapr 的密钥存储构建块通常涉及以下内容:

  1. 设置一个特定的密钥存储解决方案的组件。
  2. 在应用程序代码中使用 Dapr Secrets API 获取密钥。
  3. 在Dapr的Component文件中引用密钥

事情原理

 

 

  1. 服务A挪用 Dapr Secrets API,提供要检索的Serects的名称和要查询的项名字。
  2. Dapr sidecar 从Secrets存储中检索指定的隐秘。
  3. Dapr sidecar 将Secrets信息返回给服务。

Dapr现在支持的Secrets存储请见存储

使用Secrets时,应用程序与 Dapr sidecar 交互。 sidecar 公然Secrets API。 可以使用 HTTP 或 gRPC 挪用 API。 使用以下 URL 挪用 HTTP API:

http://localhost:<dapr-port>/v1.0/secrets/<store-name>/<name>?<metadata>

URL 包罗以下字段:

  • <dapr-port> 指定 Dapr sidecar 侦听的端口号。
  • <store-name> 指定 Dapr Secrets存储的名称。
  • <name> 指定要检索的密钥的名称。
  • <metadata> 提供Secrets的其他信息。 此段是可选的,每个Secrets存储的元数据属性差异。 有关元数据属性详细信息

项目实战

通过Dapr SDK获取secrets

仍然使用FrontEnd项目,并使用内陆文件存储Secrets,首先在默认component目录C:\Users\<username>\.dapr\components中新建文件secrets01.json,声明密钥内容

{
    "RabbitMQConnectStr": "amqp://admin:123456@192.168.43.101:5672"
}

在此目录新建secrets01.yaml界说store

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: secrets01
spec:
  type: secretstores.local.file
  version: v1
  metadata:
  - name: secretsFile
    value: C:\Users\username\.dapr\components\secrets01.json
  - name: nestedSeparator
    value: ":"

界说接口获取Secrets01的内容,新建SecretsController

using Dapr.Client;

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

using System.Collections.Generic;
using System.Threading.Tasks;

namespace FrontEnd.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class SecretsController : ControllerBase
    {
        private readonly ILogger<SecretsController> _logger;
        private readonly DaprClient _daprClient;
        public SecretsController(ILogger<SecretsController> logger, DaprClient daprClient)
        {
            _logger = logger;
            _daprClient = daprClient;
        }

        [HttpGet]
        public async Task<ActionResult> GetAsync()
        {
            Dictionary<string, string> secrets = await _daprClient.GetSecretAsync("secrets01", "RabbitMQConnectStr");
            return Ok(secrets);
        }
    }
}

 

运行Frontend

dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll

验证此api,获取乐成

 


澳洲幸运5官网www.a55555.net)是澳洲幸运5彩票官方网站,
开放澳洲幸运5彩票会员开户、澳洲幸运5彩票代理开户、
澳洲幸运5彩票线上投注、澳洲幸运5实时开奖服务的平台。

06.gif Dapr + .NET Core实战(七)Secrets 第1张

通过IConfiguration接见Secrets

Dapr还提供了从IConfiguration中接见Secrets的方式,首先引入nuget包Dapr.Extensions.Config

 

在Program.cs中修改注册

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(config =>
                {
                    var daprClient = new DaprClientBuilder().Build();
                    var secretDescriptors = new List<DaprSecretDescriptor> { new DaprSecretDescriptor("RabbitMQConnectStr") };
                    config.AddDaprSecretStore("secrets01", secretDescriptors, daprClient);
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().UseUrls("http://*:5001");
                });

在SecretsController注入IConfiguration

        private readonly ILogger<SecretsController> _logger;
        private readonly DaprClient _daprClient;
        private readonly IConfiguration _configuration;
        public SecretsController(ILogger<SecretsController> logger, DaprClient daprClient, IConfiguration configuration)
        {
            _logger = logger;
            _daprClient = daprClient;
            _configuration = configuration;
        }

在SecretsController中新增接口

        [HttpGet("get01")]
        public async Task<ActionResult> Get01Async()
        {
            return Ok(_configuration["RabbitMQConnectStr"]);
        }

挪用接口,获取数据乐成

 

其他组件引用Secrets

Dapr的其他组件,同样可以引用Secrets,我们以上节RabbitMQBinding为例,修改rabbitbinding.yaml

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: RabbitBinding
spec:
  type: bindings.rabbitmq
  version: v1
  metadata:
  - name: queueName
    value: queue1
  - name: host
 secretKeyRef: name: RabbitMQConnectStr key: RabbitMQConnectStr - name: durable
    value: true
  - name: deleteWhenUnused
    value: false
  - name: ttlInSeconds
    value: 60
  - name: prefetchCount
    value: 0
  - name: exclusive
    value: false
  - name: maxPriority
    value: 5 auth: secretStore: secrets01

secretKeyRef元素引用指定的密钥。 它将替换以前的 明文 值。  在 auth 中找到对应的secretStore。

现在运行Frontend

dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll

在RabbitMQ Management中发送新闻,消费乐成

== APP == info: FrontEnd.Controllers.RabbitBindingController[0]
== APP ==       .............binding.............11122444

限制Secrets接见权限

我们可以在Dapr的默认设置文件C:\Users\username\.dapr\config.yaml中设置Secrets的接见权限,现在我们实验阻止secrets01的权限

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  tracing:
    samplingRate: "1"
    zipkin:
      endpointAddress: http://localhost:9411/api/v2/spans
 secrets: scopes: - storeName: secrets01 defaultAccess: deny

设置之后,Frontend会启动失败,由于我们在Program.cs中设置了读取secrets01。

== APP == Unhandled exception. Dapr.DaprException: Secret operation failed: the Dapr endpoint indicated a failure. See InnerException for details.
== APP ==  ---> Grpc.Core.RpcException: Status(StatusCode="PermissionDenied", Detail="access denied by policy to get "RabbitMQConnectStr" from "secrets01"")
== APP ==    at Dapr.Client.DaprClientGrpc.GetSecretAsync(String storeName, String key, IReadOnlyDictionary`2 metadata, CancellationToken cancellationToken)
== APP ==    --- End of inner exception stack trace ---
== APP ==    at Dapr.Client.DaprClientGrpc.GetSecretAsync(String storeName, String key, IReadOnlyDictionary`2 metadata, CancellationToken cancellationToken)
== APP ==    at Dapr.Extensions.Configuration.DaprSecretStore.DaprSecretStoreConfigurationProvider.LoadAsync()
== APP ==    at Dapr.Extensions.Configuration.DaprSecretStore.DaprSecretStoreConfigurationProvider.Load()
== APP ==    at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
== APP ==    at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
== APP ==    at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
== APP ==    at Microsoft.Extensions.Hosting.HostBuilder.Build()
== APP ==    at FrontEnd.Program.Main(String[] args) in C:\demo\test\DaprBackEnd\FrontEnd\Program.cs:line 20

我们可以修改设置让其允许

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  tracing:
    samplingRate: "1"
    zipkin:
      endpointAddress: http://localhost:9411/api/v2/spans
  secrets:
    scopes:
      - storeName: secrets01
        defaultAccess: deny
 allowedSecrets: ["RabbitMQConnectStr"]

重启Frontend乐成

以下表格列出了所有可能的接见权限设置

Scenarios defaultAccess allowedSecrets deniedSecrets permission
1 - Only default access deny/allow empty empty deny/allow
2 - Default deny with allowed list deny [“s1”] empty only “s1” can be accessed
3 - Default allow with deneied list allow empty [“s1”] only “s1” cannot be accessed
4 - Default allow with allowed list allow [“s1”] empty only “s1” can be accessed
5 - Default deny with denied list deny empty [“s1”] deny
6 - Default deny/allow with both lists deny/allow [“s1”] [“s2”] only “s1” can be accessed

新2 查账www.22223388.com)提供新2网址和新2最新网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,皇冠新2网址,新2管理网址,新2网址大全,hg0088.com,hga038.com,同时开放新2信用平台查账功能.

  • 评论列表:
  •  www.a55555.net
     发布于 2021-10-07 00:01:05  回复
  • 3月31日在河南商丘一万亩梨园发生了一起龙卷风事宜造成了两名儿童殒命,一名儿童重伤,17名儿童轻伤。主要是由于星期天,万亩梨园已经着花,家长带着孩子到万亩梨园踏春,在梨园里的一个娱乐充气堡内,20名儿童在上面玩耍,突然刮起了龙卷风,卷起了这个充气包,导致了这个悲凉的效果。在这里希望去世的孩子一起走好,受伤的孩子早日康复。据有关专家从视频当中来剖析,这次龙卷风称之为尘卷风应该更为确切,由于不具备龙卷风的一些条件,事实当天晴空万里,而且发生的局限又对照小,灰尘飞扬,因此被称为“尘卷风”,而非“龙卷风”。下面注释一下尘卷风和龙卷风的区别。帅呆酷毙

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。