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

如何将Azure KeyVault签名提供程序迁移至.NET 7?

.NET 7 下 Azure Key Vault 签名提供代码迁移方案

首先明确:你提到的SecretClient是用于操作密钥(Secrets)的,而签名操作需要用**KeyClient/CryptographyClient**(来自Azure.Security.KeyVault.Keys包),这是旧KeyVaultClient对应的新客户端。下面是完整的迁移步骤和重构后代码:


第一步:替换 NuGet 包

移除旧的依赖:

  • Microsoft.Azure.KeyVault
  • Microsoft.IdentityModel.Clients.ActiveDirectory

添加.NET 7兼容的新包:

  • Azure.Security.KeyVault.Keys(用于密钥操作和签名)
  • Azure.Identity(用于Azure服务认证,替代旧的ADAL)

第二步:重构代码逻辑

旧代码的手动令牌获取逻辑可以用Azure.Identity的认证类直接替代,无需自行实现GetTokenAsync。重构后的代码如下:

using System;
using System.Threading.Tasks;
using Azure.Identity;
using Azure.Security.KeyVault.Keys.Cryptography;

public class AzureKeyVaultSigningProvider : ISigningProvider
{
    private readonly KeyVaultConnectionString _connectionString;
    private readonly CryptographyClient _cryptoClient;

    public AzureKeyVaultSigningProvider(string connectionString)
    {
        _connectionString = new KeyVaultConnectionString(connectionString);
        _connectionString.Validate();

        // 初始化认证凭据,替代旧的GetTokenAsync逻辑
        var credential = new ClientSecretCredential(
            _connectionString.TenantId, // 注意:旧连接串需包含租户ID,若之前无此字段需补充解析逻辑
            _connectionString.ClientId,
            _connectionString.ClientSecret);

        // 根据密钥配置初始化加密客户端
        if (_connectionString.HasKeyName)
        {
            var keyIdentifier = new KeyVaultKeyIdentifier(_connectionString.Url, _connectionString.KeyName, _connectionString.KeyVersion);
            _cryptoClient = new CryptographyClient(keyIdentifier, credential);
        }
        else
        {
            // 新版本API要求明确指定密钥,建议强制配置密钥名称,避免模糊操作
            throw new InvalidOperationException("连接串必须指定密钥名称才能在.NET 7环境下使用");
        }
    }

    // 同步签名方法(保持原有接口兼容)
    public byte[] SignHash(byte[] bytes)
    {
        return SignAsync(bytes).GetAwaiter().GetResult();
    }

    // 异步签名方法,适配新API
    public async Task<byte[]> SignAsync(byte[] bytes)
    {
        // 将旧的字符串算法映射为新的枚举类型
        var signatureAlgorithm = MapAlgorithm(_connectionString.Algorithm);
        
        var signResult = await _cryptoClient.SignAsync(signatureAlgorithm, bytes);
        return signResult.Signature;
    }

    // 算法映射辅助方法,根据实际使用的算法补充分支
    private SignatureAlgorithm MapAlgorithm(string algorithm)
    {
        return algorithm switch
        {
            "RS256" => SignatureAlgorithm.RS256,
            "RS384" => SignatureAlgorithm.RS384,
            "RS512" => SignatureAlgorithm.RS512,
            "ES256" => SignatureAlgorithm.ES256,
            _ => throw new NotSupportedException($"不支持的签名算法:{algorithm}")
        };
    }
}

关键变化说明

  • 认证逻辑简化:用ClientSecretCredential替代手动编写的令牌获取逻辑,Azure.Identity会自动处理令牌的获取、缓存和刷新,无需依赖ADAL。
  • 客户端替换:旧的KeyVaultClient换成CryptographyClient,专门负责加密/签名操作,贴合单一职责原则。
  • API调整:新的SignAsync直接返回签名结果,无需从KeyOperationResult中提取数据,逻辑更简洁。
  • 算法类型安全:将旧的字符串算法名称映射为SignatureAlgorithm枚举,避免字符串硬编码带来的错误。
  • 密钥约束:新版本API要求明确指定密钥,若旧代码允许无密钥名称的模糊操作,建议修改配置强制指定,或补充密钥遍历选择逻辑(不推荐)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:55:27