You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC 5应用迁移至Azure.Security.KeyVault.Secrets:替换已弃用Microsoft.Azure.KeyVault的证书认证取秘代码

没问题,我帮你把这段代码迁移到新的Azure.Security.KeyVault.Secrets库上,这个新库确实比旧的更简洁,而且是官方主推的方案。

迁移到Azure.Security.KeyVault.Secrets的实现方案

首先,你需要先安装两个必要的NuGet包:

  • Azure.Security.KeyVault.Secrets(核心密钥库操作库)
  • Azure.Identity(处理Azure服务的认证,包括证书认证)

接下来是重构后的代码,我尽量保留了原代码的逻辑和同步调用方式,同时适配新库的API:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using System.Security.Cryptography.X509Certificates;
using System.Configuration;

public static string GetSecretWithCert(string secretNode)
{
    if (string.IsNullOrWhiteSpace(secretNode))
        return string.Empty;

    string clientId = ConfigurationManager.AppSettings["ClientId"];
    string keyVaultName = ConfigurationManager.AppSettings["KeyVaultName"];
    string keyVaultCertificateThumbprint = ConfigurationManager.AppSettings["KvThumbprint"];
    var keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net/");

    // 用ClientCertificateCredential创建证书认证凭证
    // 这个类会自动从当前用户的My存储区查找对应指纹的证书,省去手动操作证书存储的代码
    var credential = new ClientCertificateCredential(
        tenantId: null, // 单租户应用可以填写租户ID,null会自动从证书/配置推断
        clientId: clientId,
        certificateThumbprint: keyVaultCertificateThumbprint,
        certificateStoreLocation: StoreLocation.CurrentUser,
        certificateStoreName: StoreName.My);

    // 初始化新的SecretClient,替代旧的KeyVaultClient
    var secretClient = new SecretClient(keyVaultUri, credential);

    try
    {
        // 调用GetSecretAsync获取密钥,保持原代码的同步执行方式
        KeyVaultSecret secret = secretClient.GetSecretAsync(secretNode).GetAwaiter().GetResult();
        return secret?.Value;
    }
    catch (Exception ex)
    {
        // 可根据需求添加自定义错误处理(比如证书找不到、权限不足等场景)
        throw ex;
    }
}

关键变化说明:

  • 认证逻辑简化:新库用Azure.Identity.ClientCertificateCredential替代了原来手动操作AuthenticationContext和ClientAssertionCertificate的繁琐逻辑,自动处理证书查找和Token获取。
  • 客户端类替换:KeyVaultClient换成了SecretClient,API更专注于密钥操作,语义更清晰。
  • 返回类型更新:原来的SecretBundle变为KeyVaultSecret,获取密钥值依然通过.Value属性,保持使用习惯一致。
  • URI处理优化:只需要传入密钥库的根URI,不需要手动拼接完整的secret路径,直接传入secret名称即可。

额外建议:

如果你的应用是异步环境(比如ASP.NET MVC的异步Action),建议直接使用await secretClient.GetSecretAsync(secretNode),避免GetAwaiter().GetResult()可能引发的死锁问题。

内容的提问来源于stack exchange,提问作者aj go

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:52:41