Dapr + .NET 实战(七)Secrets

什么是Secrets

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

通常这需要建立一个密钥存储,如Azure Key Vault、Hashicorp等,并在那里存储应用程序级别的密钥。要访问这些密钥存储,应用程序需要导入密钥存储SDK,并使用它访问这些密钥。这可能需要相当数量的模板代码,这些代码与应用的实际业务领域无关,因此在多云场景中,可能会使用不同厂商特定的密钥存储,这就成为一个更大的挑战。

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

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

  1. 设置一个特定的密钥存储解决方案的组件。

  2. 在应用程序代码中使用 Dapr Secrets API 获取密钥。

  3. 在Dapr的Component文件中引用密钥

工作原理

2b2a9e90baff0fb68fa973dfc5ad0dbc.png

  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.fileversion: v1metadata:- name: secretsFilevalue: C:\Users\username\.dapr\components\secrets01.json- name: nestedSeparatorvalue: ":"

定义接口获取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,获取成功

1a42ca8024c16a7393ae391bdc2f28a2.png

通过IConfiguration访问Secrets

Dapr还提供了从IConfiguration中访问Secrets的方法,首先引入nuget包Dapr.Extensions.Config

9d44edfa8aa333329ff84161e5ce74aa.png

在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"]);}

调用接口,获取数据成功

954a6a63fa2b6573acbd3bb78ef50ff6.png

其他组件引用Secrets

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

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: RabbitBinding
spec:type: bindings.rabbitmqversion: v1metadata:- name: queueNamevalue: queue1- name: hostsecretKeyRef:name: RabbitMQConnectStrkey: RabbitMQConnectStr- name: durablevalue: true- name: deleteWhenUnusedvalue: false- name: ttlInSecondsvalue: 60- name: prefetchCountvalue: 0- name: exclusivevalue: false- name: maxPriorityvalue: 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/spanssecrets:scopes:- storeName: secrets01defaultAccess: 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/spanssecrets:scopes:- storeName: secrets01defaultAccess: denyallowedSecrets: ["RabbitMQConnectStr"]

重启Frontend成功

以下表格列出了所有可能的访问权限配置

ScenariosdefaultAccessallowedSecretsdeniedSecretspermission
1 - Only default accessdeny/allowemptyemptydeny/allow
2 - Default deny with allowed listdeny[“s1”]emptyonly “s1” can be accessed
3 - Default allow with deneied listallowempty[“s1”]only “s1” cannot be accessed
4 - Default allow with allowed listallow[“s1”]emptyonly “s1” can be accessed
5 - Default deny with denied listdenyempty[“s1”]deny
6 - Default deny/allow with both listsdeny/allow[“s1”][“s2”]only “s1” can be accessed
相关文章:
  • Dapr实战(一) 基础概念与环境搭建

  • Dapr + .NET Core实战(二) 服务调用

  • Dapr + .NET Core实战(三)状态管理

  • Dapr + .NET 实战(四)发布和订阅

  • Dapr + .NET 实战(五)Actor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

只有成年人才懂的“爽”,一定要安利给每一个人

▲ 点击查看在日常生活中&#xff0c;诸位是不是经常遇到这些问题&#xff1a;打球扭伤、骑车摔伤、跑步拉伤、户外受伤。或者经常伏案工作&#xff0c;一天上班下来&#xff0c;感觉肩膀酸痛到僵硬&#xff0c;对什么事都提不起兴趣。回到家腰酸、背疼&#xff0c;随便做个伸展…

xml.query() 实例演示

xml.query()函数&#xff0c;XQuery表达式可以返回xml一个单一的元素或是所有元素。 我们继续使用上一篇所创建表[dbo].[tbDevLanguage] http://www.cnblogs.com/insus/archive/2012/02/25/2367668.html 首先我们演示Query所有元素&#xff0c;注意一下查询节点&#xff0c;返回…

图像处理前沿技术_深入浅出人工智能前沿技术—机器视觉检测,看清人类智慧工业...

早在50年前&#xff0c;工业机器人就已经横空出世&#xff0c;给人类带来更多的方便与可能。今天&#xff0c;工业机器人正以迅猛的发展速度替代人工&#xff0c;从事繁重及枯燥的工作&#xff0c;并且向着更智能的方向在发展&#xff0c;而服务机器人&#xff0c;将会是下一个…

最全高考分数线出炉!!查了分后,这届学生为了过线真是太拼了.......

全世界只有3.14 % 的人关注了爆炸吧知识2020年高考成绩今天可以查了&#xff01;你还记得自己查分那天是什么心情吗&#xff1f;反正超模君当年是想看却又不敢看表面越是想要云淡风轻内心就越不受控制的心跳失控转眼过去了许多年又到了高考放榜的日子在这么欢乐的日子里怎么能缺…

学习笔记之web worker

当在 HTML 页面中执行脚本时&#xff0c;页面的状态是不可响应的&#xff0c;直到脚本已完成。web worker 是运行在后台的 JavaScript&#xff0c;独立于其他脚本&#xff0c;不会影响页面的性能。您可以继续做任何愿意做的事情&#xff1a;点击、选取内容等等&#xff0c;而此…

让人难以置信的HTML5和JavaScript实验

Google的 Chrome实验室收集了很多让人难以置信的基于 HTML5 Canvas 和 JavaScript 的实验项目&#xff0c;里面的例子都很独特&#xff0c;让人惊叹。我从未想过结合 HTML 和 JavaScript 能实现这么强大的效果。今天&#xff0c;本文与大家分享其中9个很棒的例子&#xff0c;为…

22468!Windows 11新预览版发布:旧版系统支持十月终止请速升

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软现已发布 Windows 11 预览版 Build 22468。Windows 11 Insider Preview Build 22468 主要变化如下&#xff1a;1.此前 Dev 频道推送的所有 Windows 11 预览版将于 2021 年 10 月 31 日到期&#xff0c;请立即更新到 Windo…

influxdb mysql对比_InfluxDB和MySQL的读写对比测试

今天进行了InfluxDB和MySQL的读写对比测试&#xff0c;这里记录下结果&#xff0c;也方便我以后查阅。操作系统&#xff1a; CentOS6.5_x64InfluxDB版本 &#xff1a; v1.1.0MySQL版本&#xff1a;v5.1.73CPU &#xff1a; Intel(R) Core(TM) i5-2320 CPU 3.00GHz内存 &#x…

Zabbix Maintenance 维护周期

为什么80%的码农都做不了架构师&#xff1f;>>> 概述 你可以定义维护周期在主机或主机组里。这里有2种维护状态&#xff0c;一种是停止对目标的监控数据的收集&#xff0c;一种是继续对目标的监控数据的收集。 当不想收到维护中的服务器的报警时候&#xff0c;需…

女生心中的理想男生!这些条件你符合几条?

1 女生心中的理想男生2 女人购物&男人购物3 好像有点混乱4 哥们和我女朋友整天打打闹闹&#xff0c;真无聊。5 分手吧6 妈妈专属头像-&#xff01;你点的每个赞&#xff0c;我都认真当成了喜欢

mysql 定义XML字段_MyBatis之基于XML的属性与列名映射

上一博客主要是对单表的增删改查&#xff0c;比较简单&#xff0c;而且每个属性与table表的列都是一一对应名字也一样&#xff0c;今天主要学习属性与table表列名不一致的处理&#xff0c;主要有两种一是属性与列名不一致&#xff0c;二是枚举的情况&#xff0c;这里暂时考虑的…

Dapr闪电说 - Dapr落地云原生架构

你认识Dapr么&#xff1f;出自微软&#xff0c;面向社区&#xff0c;开源的云原生工具Dapr已经发布多时了&#xff0c;你了解Dapr的相关知识么&#xff1f;无论你是.NET程序员还是Python &#xff0c;或者Java &#xff0c;还有Go等都可以用Dapr来完成你的云原生场景。本次闪电…

uboot移植9个步骤_不知道具体的新房装修步骤?9个步骤教你吃透装修

最近有同学准备装修新房了&#xff0c;不知道具体的装修步骤是怎么样的&#xff0c;需要花多少预算&#xff1f;装修时间要多久&#xff1f;其实这也不奇怪&#xff0c;很多没有装修经验的朋友对这方面都不太了解的&#xff0c;今天分享一般装修的流程工序&#xff0c;希望能给…

太牛了,原来古人是这样铸造钱币的。。。

全世界只有3.14 % 的人关注了爆炸吧知识古代钱币是怎么做出来的呢&#xff1f;今天与各位说说古钱币的铸造工艺&#xff0c;抛砖引玉让大家更多了解假货的鉴别特点。关于古代钱币铸造工艺的记录文献资料&#xff0c;遗留极少。关于母钱翻砂技术&#xff0c;最早的史料见于明代宋…

渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 汉

中文名: 终级渲染器 渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 顶渲简体中文版 资源格式: 压缩包 版本: R3.5 发行时间: 2010年 制作发行: 原创:cebas VISUAL TECHNOLOGY Inc 中文:顶渲 Ma5 www.toprender.com 地区: 德国 语言: 简体中文,…

java赋值语句_java并发编程之原子性问题

程序是否线程安全&#xff0c;取决于哪些要素呢&#xff0c;主要是以下三个&#xff1a;原子性&#xff0c;可见性&#xff0c;有序性。今天先一起来学习原子性。原子性&#xff1a;我理解一个操作不可再分&#xff0c;即为原子性。而在并发编程的环境中&#xff0c;原子性的含…

“高阶思维”发展意识

1. 前言这个题目不太好交流&#xff0c;因为每个人的认知层面不同&#xff0c;不好达成大多数人趋近相同的看法。这个题目高度抽象化&#xff0c;不谈具体化的内容显得空洞及不容易理解&#xff0c;谈具体化的内容又无法找到着力点。抽象能力本身就是高阶思维的一种体现形式&a…

SQL Server返回当前实例系统日期和时间的函数

下面列举出SQL Server返回实例系统日期和时间的函数&#xff0c;除了ANSI标准函数CURRENT_TIMESTAMP在应用时无需在函数后多加一对空的小括号"()"外&#xff0c;其余均需。 从返回的数据类型"DATETIME2"就可以知道&#xff0c;后面三个函数是SQL Server 20…

培养沙雕要从娃娃抓起

1 培养沙雕要从娃娃抓起▼2 好了好了你们两个可以去洗发店门口上班了▼3 毛绒版俄罗斯方块纵享丝滑▼4 我还以为会有令人期待的被打环节▼5 小蜘蛛你好我是唐僧&#xff0c;请问我可以跟你回盘丝洞吗▼6 吃冰淇淋讲究直接上手▼7 在等奶茶的美团小哥我也想像他一样出门荡…

详解Ubuntu for Android:Thin Client

原文地址&#xff1a;http://blog.csdn.net/ce123/article/details/7291445 详解Ubuntu for Android&#xff1a;Thin Client 一、Ubuntu for Android的定义 在移动终端性能日益强大、多核处理器基本普及的现在&#xff0c;将通用的Ubuntu操作系统与Android系统进行亲密的整合&…