0

我想在 winforms 应用程序中使用 azure key vault。我设法将应用程序添加到 Azure 活动目录,并使用 powershell 在密钥库中创建了一个秘密。该应用程序经过身份验证以使用该密钥。不幸的是,我无法在我的 winforms 应用程序中使用该秘密。我得到了例外:

*sts_token_request_failed:对安全令牌服务的令牌请求失败。检查 InnerException 以获取更多详细信息。

InnerException:AADSTS70002:验证凭据时出错。AADSTS50012:提供的客户端密码无效。*

配置:

<appSettings>    
 <add key="ClientId" value="<appId>" />
 <add key="ClientSecret" value="<nameofsecret>" />   
 <add key="SecretUri" value="https://<vaultname>.vault.azure.net/secrets/<nameofsecret>" />
</appSettings>

我的代码是:

public static string GetSecret()
{
        var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken));
        var sec = kv.GetSecretAsync(ConfigurationManager.AppSettings["SecretUri"]).Result.Value;
        return sec; 
}

public async static Task<string> GetToken(string authority, string resource, string scope)
    {
        var authContext = new AuthenticationContext(authority,true);
        ClientCredential clientCred = new ClientCredential(ConfigurationManager.AppSettings["ClientId"],
            ConfigurationManager.AppSettings["ClientSecret"]);
        try
        {
            AuthenticationResult result = authContext.AcquireToken(resource, clientCred);

            if (result == null)
                throw new InvalidOperationException("Failed to obtain the JWT token");

            return result.AccessToken;
        }
        catch (Exception ex)
        {
            return String.Empty;
        }            
    }

我是否必须更改清单或 app.config 中的任何内容?什么是secretName?它是在 powershell 中创建的秘密的名称吗?在本机客户端应用程序中,我在活动目录中没有“配置”选项卡来添加密钥。这可能是问题吗?

4

1 回答 1

1

你将在 Azure AD 中注册的应用程序的客户端机密与存储在 Key Vault 中的机密混淆了。

为了访问密钥保管库,您的应用程序必须首先获取访问令牌,这应该在您的GetToken方法中发生。有多种方法可以向 AAD 进行身份验证以获取令牌,但最常见的是为您的应用程序配置密钥并将其作为客户端密码传递。

在此处输入图像描述

因此,您的 ClientSecret 应用程序设置的值将是此密钥,而不是密钥保管库中的密钥名称。

获得令牌后,您就可以使用它来读取存储在密钥保管库中的秘密。


这就是您问题的技术答案。关于如何管理本机应用程序的秘密,还有一个完整的“另一个对话”。使用密钥保险库方法,您仍然必须拥有可供应用程序访问的密钥才能访问密钥保险库,因此您有点回到了如何保护密钥的起点。

于 2016-06-07T22:04:31.713 回答