日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

Dapr + .NET 实战(七)Secrets

發(fā)布時(shí)間:2023/12/4 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dapr + .NET 实战(七)Secrets 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是Secrets

應(yīng)用程序通常會(huì)通過(guò)使用專用的存儲(chǔ)來(lái)存儲(chǔ)敏感信息,如連接字符串、密鑰等。

通常這需要建立一個(gè)密鑰存儲(chǔ),如Azure Key Vault、Hashicorp等,并在那里存儲(chǔ)應(yīng)用程序級(jí)別的密鑰。要訪問(wèn)這些密鑰存儲(chǔ),應(yīng)用程序需要導(dǎo)入密鑰存儲(chǔ)SDK,并使用它訪問(wèn)這些密鑰。這可能需要相當(dāng)數(shù)量的模板代碼,這些代碼與應(yīng)用的實(shí)際業(yè)務(wù)領(lǐng)域無(wú)關(guān),因此在多云場(chǎng)景中,可能會(huì)使用不同廠商特定的密鑰存儲(chǔ),這就成為一個(gè)更大的挑戰(zhàn)。

讓開(kāi)發(fā)人員在任何地方更容易訪問(wèn)應(yīng)用程序密鑰, Dapr 提供一個(gè)專用的密鑰構(gòu)建塊 ,允許開(kāi)發(fā)人員從一個(gè)存儲(chǔ)獲得密鑰。

使用 Dapr 的密鑰存儲(chǔ)構(gòu)建塊通常涉及以下內(nèi)容:

  • 設(shè)置一個(gè)特定的密鑰存儲(chǔ)解決方案的組件。

  • 在應(yīng)用程序代碼中使用 Dapr Secrets API 獲取密鑰。

  • 在Dapr的Component文件中引用密鑰

  • 工作原理

  • 服務(wù)A調(diào)用 Dapr Secrets API,提供要檢索的Serects的名稱和要查詢的項(xiàng)名字。

  • Dapr sidecar 從Secrets存儲(chǔ)中檢索指定的機(jī)密。

  • Dapr sidecar 將Secrets信息返回給服務(wù)。

  • Dapr目前支持的Secrets存儲(chǔ)請(qǐng)見(jiàn)存儲(chǔ)

    使用Secrets時(shí),應(yīng)用程序與 Dapr sidecar 交互。sidecar 公開(kāi)Secrets API??梢允褂?HTTP 或 gRPC 調(diào)用 API。使用以下 URL 調(diào)用 HTTP API:

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

    URL 包含以下字段:

    • <dapr-port>?指定 Dapr sidecar 偵聽(tīng)的端口號(hào)。

    • <store-name>?指定 Dapr Secrets存儲(chǔ)的名稱。

    • <name>?指定要檢索的密鑰的名稱。

    • <metadata>?提供Secrets的其他信息。此段是可選的,每個(gè)Secrets存儲(chǔ)的元數(shù)據(jù)屬性不同。有關(guān)元數(shù)據(jù)屬性詳細(xì)信息

    項(xiàng)目實(shí)戰(zhàn)

    通過(guò)Dapr SDK獲取secrets

    仍然使用FrontEnd項(xiàng)目,并使用本地文件存儲(chǔ)Secrets,首先在默認(rèn)component目錄C:\Users\<username>\.dapr\components中新建文件secrets01.json,聲明密鑰內(nèi)容

    {"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的內(nèi)容,新建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);}} }

    運(yùn)行Frontend

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

    驗(yàn)證此api,獲取成功

    通過(guò)IConfiguration訪問(wèn)Secrets

    Dapr還提供了從IConfiguration中訪問(wèn)Secrets的方法,首先引入nuget包Dapr.Extensions.Config

    在Program.cs中修改注冊(cè)

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

    調(diào)用接口,獲取數(shù)據(jù)成功

    其他組件引用Secrets

    Dapr的其他組件,同樣可以引用Secrets,我們以上節(jié)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?中找到對(duì)應(yīng)的secretStore。

    現(xiàn)在運(yùn)行Frontend

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

    在RabbitMQ Management中發(fā)送消息,消費(fèi)成功

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

    限制Secrets訪問(wèn)權(quán)限

    我們可以在Dapr的默認(rèn)配置文件C:\Users\username\.dapr\config.yaml中設(shè)置Secrets的訪問(wèn)權(quán)限,現(xiàn)在我們嘗試禁止secrets01的權(quán)限

    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

    設(shè)置之后,Frontend會(huì)啟動(dòng)失敗,因?yàn)槲覀冊(cè)赑rogram.cs中設(shè)置了讀取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成功

    以下表格列出了所有可能的訪問(wèn)權(quán)限配置

    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
    相關(guān)文章:
    • Dapr實(shí)戰(zhàn)(一) 基礎(chǔ)概念與環(huán)境搭建

    • Dapr + .NET Core實(shí)戰(zhàn)(二) 服務(wù)調(diào)用

    • Dapr + .NET Core實(shí)戰(zhàn)(三)狀態(tài)管理

    • Dapr + .NET 實(shí)戰(zhàn)(四)發(fā)布和訂閱

    • Dapr + .NET 實(shí)戰(zhàn)(五)Actor

    總結(jié)

    以上是生活随笔為你收集整理的Dapr + .NET 实战(七)Secrets的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。