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

如何在SpecFlow Feature示例表中加载Azure Key Vault的登录凭据?

如何将Azure Key Vault中的值填充到SpecFlow Feature文件的示例表中

当然可以实现,不过SpecFlow不会自动识别Feature文件里的Key Vault占位符,需要我们自行添加解析逻辑,以下是具体实现步骤:

1. 编写Azure Key Vault访问工具类

借助Azure官方SDK包(Azure.Security.KeyVault.Secrets)封装读取Key Vault密钥的逻辑:

using Azure.Security.KeyVault.Secrets;
using Azure.Identity;

public class KeyVaultHelper
{
    private readonly SecretClient _secretClient;

    public KeyVaultHelper(string keyVaultUrl)
    {
        // 使用默认Azure凭据(本地开发可通过Azure CLI/Visual Studio登录,线上用托管身份等)
        _secretClient = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    }

    // 根据密钥名称获取对应值
    public string GetSecret(string secretName)
    {
        var secret = _secretClient.GetSecret(secretName);
        return secret.Value;
    }
}

2. 在SpecFlow钩子中初始化工具类

通过SpecFlow的BeforeTestRun钩子,在测试启动时初始化KeyVaultHelper,确保整个测试流程中可调用:

[Binding]
public class Hooks
{
    // 静态变量供绑定方法直接访问
    public static KeyVaultHelper KeyVaultHelper { get; private set; }

    [BeforeTestRun]
    public static void InitializeKeyVault()
    {
        // 替换为你的Key Vault地址
        string keyVaultUrl = "https://your-key-vault-name.vault.azure.net/";
        KeyVaultHelper = new KeyVaultHelper(keyVaultUrl);
    }
}

3. 修改绑定方法,解析占位符并替换

在原有的When绑定方法中,增加逻辑判断传入参数是否为Key Vault占位符(如{U1keyVaultUsername}格式),若是则替换为Key Vault中的真实值:

[When(@"(.*) User enters login credentials of (.*) & (.*)")]
public void WhenUserEntersLoginCredentials(String role, String username, String password)
{
    // 解析用户名和密码的占位符
    string actualUsername = ResolveSecretPlaceholder(username);
    string actualPassword = ResolveSecretPlaceholder(password);

    Console.WriteLine("Entering Username/Email...");
    this._driver.FindElement(this._userNameTextField).SendKeys(actualUsername);
            
    Console.WriteLine("Entering Password...");
    _driver.FindElement(this._passwordTextField).SendKeys(actualPassword);

    Console.WriteLine("Clicking Sign In...");
    _driver.FindElement(this._submitLoginBtn).Click(); 
}

// 私有方法处理占位符解析
private string ResolveSecretPlaceholder(string placeholder)
{
    if (placeholder.StartsWith("{") && placeholder.EndsWith("}"))
    {
        // 移除占位符的{},提取密钥名称
        string secretName = placeholder.Trim('{', '}');
        return Hooks.KeyVaultHelper.GetSecret(secretName);
    }
    // 非占位符则直接返回原内容
    return placeholder;
}

4. 配置Azure身份验证权限

确保运行测试的环境具备访问目标Key Vault的权限:

  • 本地开发:可通过Azure CLI执行az login登录,或在Visual Studio中登录Azure账号
  • CI/CD环境:配置服务主体或托管身份,并为该主体分配Key Vault的"密钥读取者"权限

这样处理后,Feature文件中的{U1keyVaultUsername}和{U1keyVaultPass}会自动替换为Azure Key Vault中对应的真实凭据,既保障了敏感数据的安全性,又不影响Feature文件的可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:25:16