我想在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中的任何内容?什么是秘密名称?它是powershell中创建的秘密的名称吗?在本机客户端应用程序中,我没有选项卡&#34; configure&#34;在活动目录中添加密钥。这可能是问题吗?
答案 0 :(得分:1)
您将在Azure AD中注册的应用程序的客户端密钥与存储在密钥保管库中的密钥混淆。
要访问密钥保管库,您的应用程序必须首先获取访问令牌,这是GetToken
方法中应该发生的事情。有多种方法可以向AAD进行身份验证以获取令牌,但最常见的方法是为您的应用程序配置密钥并将其作为客户端密钥传递。
因此,ClientSecret应用程序设置的值将是此密钥,而不是密钥库中密钥的名称。
一旦您获得了令牌,您就可以使用它来读取存储在密钥库中的秘密。
这是您问题的技术答案。关于如何管理本机应用程序的秘密,还有一个完整的对话。使用密钥保险库方法,您仍然必须拥有应用程序可访问密钥保险库的密钥,因此您可以回到最初的位置,了解如何保护 密钥