UWP / WinUI桌面应用程序对Azure Key Vault机密的访问权限

时间:2020-07-17 20:55:04

标签: uwp desktop azure-keyvault winui

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机密-而不会在此过程中暴露其他机密的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

最终,您的应用必须存储某种SOME机密-因为它需要将该密钥提供给Key Vault实例,以证明确实允许该应用访问该机中存储的机密保险柜。这类似于从数据库检索值-必须先存储并提供连接字符串,然后才能获取值。

在不了解您打算如何部署应用程序的特定用例的情况下,无法建议您应该做什么或不应该做什么。在我们的案例中,我们有一个WinForms应用程序,该应用程序已由支持团队明确安装到客户的计算机上,这意味着client certificates的旧黄金标准是迄今为止一直使用的-通过自定义验证

Key Vault explicitly supports client certificates(感谢从链接的MSDN复制来的步骤):

  1. 创建PKCS#12存档(.pfx)证书。用于创建证书的选项包括Windows上的MakeCert和OpenSSL。
  2. 将证书安装到当前用户的个人证书存储中。将密钥标记为可导出是可选的。请注意证书的指纹,该指纹将在此过程的后面使用。
  3. 将PKCS#12存档(.pfx)证书导出为DER编码的证书(.cer)。
  4. 使用Azure AD注册应用(应用程序注册)。
  5. 将DER编码的证书(.cer)上载到Azure AD:
    一种。在Azure AD中选择应用。
    b。导航到证书和机密。
    C。选择上载证书以上传包含公钥的证书。可以使用.cer,.pem或.crt证书。
  6. 将密钥库名称,应用程序ID和证书指纹存储在应用程序的appsettings.json文件中。
  7. 在Azure门户中导航到关键文件库。
  8. 选择使用“ Azure密钥保管库”在生产环境的“秘密”存储中创建的密钥保管库。
  9. 选择访问策略。
  10. 选择添加访问策略。
  11. 打开“秘密”权限,并为应用程序提供“获取和列出”权限。
  12. 选择“选择主体”,然后按名称选择注册的应用。选择选择按钮。
  13. 选择确定。
  14. 选择保存。
  15. 部署应用。

我们目前正在用Key Vault替换自定义客户端证书验证器,因为这将使一切变得更加轻松-从Azure Portal而非我们的自定义管理应用程序管理证书和吊销。

答案 1 :(得分:-1)

我需要将这些机密存储在代码或配置文件中,以便在运行时读取

您可以将Azure注册信息(TenentId,ClientId和ClientSecret)设置为Secret Manager并读取该值,而不是公开秘密。

请参考以下步骤:

1。启用安全管理器。您需要通过在项目目录上运行来使用init关键字。

dotnet user-secrets init

这将在项目UserSecretId文件中为.csproj创建Guid。

enter image description here

2。设置秘密。您可以使用set关键字设置机密

dotnet user-secrets set tenantId "xxxxxxxxxxxx"

enter image description here

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;

工作结果如下:

enter image description here

有关机密管理器的更多详细信息,您可以参考此article