Microsoft提供了几种安全访问Azure Key Vault机密的方法,尤其是使用托管身份或服务主体作为身份提供者。但是,这些方法被明确设计为与基于Azure的资源(例如Web应用程序和微服务)一起使用。它们不适用于UWP / WinUI桌面应用程序。
到目前为止,我发现唯一允许UWP / WinUI桌面应用程序访问Key Vault的方法是将应用程序的Azure注册信息(TenentId,ClientId和ClientSecret –机密本身!)加载到获取的环境变量中。在创建新的SecretClient对象(Azure.Security.KeyVault.Secrets)时由DefaultAzureCredential()方法拾取。
但这意味着我需要将这些机密存储在代码或配置文件中,以便在运行时读取。绝对不是最佳实践!我一定很想念东西。
在2020年,UWP / WinUI桌面应用程序可以安全地访问Key Vault机密-而不会在此过程中暴露其他机密的最佳做法是什么?
答案 0 :(得分:0)
最终,您的应用必须存储某种SOME机密-因为它需要将该密钥提供给Key Vault实例,以证明确实允许该应用访问该机中存储的机密保险柜。这类似于从数据库检索值-必须先存储并提供连接字符串,然后才能获取值。
在不了解您打算如何部署应用程序的特定用例的情况下,无法建议您应该做什么或不应该做什么。在我们的案例中,我们有一个WinForms应用程序,该应用程序已由支持团队明确安装到客户的计算机上,这意味着client certificates的旧黄金标准是迄今为止一直使用的-通过自定义验证
Key Vault explicitly supports client certificates(感谢从链接的MSDN复制来的步骤):
我们目前正在用Key Vault替换自定义客户端证书验证器,因为这将使一切变得更加轻松-从Azure Portal而非我们的自定义管理应用程序管理证书和吊销。
答案 1 :(得分:-1)
我需要将这些机密存储在代码或配置文件中,以便在运行时读取
您可以将Azure注册信息(TenentId,ClientId和ClientSecret)设置为Secret Manager并读取该值,而不是公开秘密。
请参考以下步骤:
1。启用安全管理器。您需要通过在项目目录上运行来使用init关键字。
dotnet user-secrets init
这将在项目UserSecretId
文件中为.csproj
创建Guid。
2。设置秘密。您可以使用set关键字设置机密
dotnet user-secrets set tenantId "xxxxxxxxxxxx"
3。从机密管理器中读取代码。
private readonly IConfiguration _configuration;
public WeatherForecastController( IConfiguration configuration)
{
_configuration = configuration;
}
string keyVaultUrl = "https://xxxx.vault.azure.net";
TokenCredential credential = new DefaultAzureCredential();
credential = new ClientSecretCredential(_configuration["tenantId"], _configuration["clientId"], _configuration["clientSecret"]);
var secretClient = new SecretClient(new Uri(keyVaultUrl), credential);
KeyVaultSecret secret = secretClient.GetSecret("xxxx");
var secretvalue = secret.Value;
工作结果如下:
有关机密管理器的更多详细信息,您可以参考此article。