如何将Azure KeyVault签名提供程序迁移至.NET 7?
.NET 7 下 Azure Key Vault 签名提供代码迁移方案
首先明确:你提到的SecretClient是用于操作密钥(Secrets)的,而签名操作需要用**KeyClient/CryptographyClient**(来自Azure.Security.KeyVault.Keys包),这是旧KeyVaultClient对应的新客户端。下面是完整的迁移步骤和重构后代码:
第一步:替换 NuGet 包
移除旧的依赖:
Microsoft.Azure.KeyVaultMicrosoft.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
相关产品推荐
相关产品推荐

