【问题标题】:Accessing Azure Key Vault from Native Application从本机应用程序访问 Azure Key Vault
【发布时间】:2018-07-02 13:49:57
【问题描述】:

我有一个 .Net 应用程序发布到 Azure Web 应用程序服务(本机应用程序) 我想从那里访问我的 Azure Key Vault。 我已经尝试过了:Accessing Key Vault from Native App

但它仅在本地运行应用程序时有效,在 Azure Web 应用程序服务中运行时失败,我收到此错误:

对 COM 组件的调用已返回错误 HRESULT E_FAIL。

并在这个方法中抛出:

await context.AcquireTokenAsync("https://vault.azure.net", 
                                ClientId, 
                                new Uri(ClientRedirectURI), 
                                new PlatformParameters(PromptBehavior.Auto));

还有其他方法可以从本机应用程序访问我的 Key Vault 吗?
“从 Web 应用程序访问 Key Vault”之类的教程对我不起作用,因为我没有 ClientSecretID。

谢谢!

【问题讨论】:

  • 我认为这里有两件事被误认为是彼此......原生应用程序是一个类似于控制台或 Windows 应用程序的应用程序。简而言之:您不能在应用服务上安装本机应用。 “本机客户端应用程序与 Web 应用程序不同,因为它们安装在设备上,而 Web 应用程序是通过浏览器访问的。”
  • “因为我没有 ClientSecretID,所以‘从 Web 应用程序访问 Key Vault’之类的教程对我不起作用。”将您的应用程序注册为 Web 应用程序并创建一个?
  • 感谢@rickvdbosch 的回答。我正在关注本教程 [链接] docs.microsoft.com/en-us/power-bi/developer/… [链接] 它说我必须使用本机应用程序。我将尝试使用 Web 应用程序。谢谢!

标签: .net azure azure-keyvault


【解决方案1】:

对 COM 组件的调用已返回错误 HRESULT E_FAIL

你的情况需要提示界面输入用户名和密码才能获得信用。

但 WebApp 是 sandbox。沙盒会阻止对所有进程外 COM 服务器的访问。

正如 rickvdbosch 提到的,您可以注册一个 Azure AD WebApp 来获取 clientId 和 secretkey。更多信息请参考toturial。以下是如何访问keyvault的演示代码。

  public static async Task<string> GetAccessToken(string tenantId,string appId,string secretKey)
    {

        var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
        ClientCredential clientCredential = new ClientCredential(appId, secretKey);
        var tokenResponse =await context.AcquireTokenAsync("https://vault.azure.net", clientCredential); //KeyVault resource : https://vault.azure.net
        var accessToken = tokenResponse.AccessToken;
        return accessToken;
    }

    var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessToken));

我们也可以使用 Azure Web MSI function 来做到这一点。您还可以从这个toturial获得如何访问密钥库代码

using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/");
// OR
var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

【讨论】:

  • 我已将我的应用程序发布到一个新的 Azure Web 应用服务,并且我使用了您在答案中提到的第一个代码,它运行良好!!!谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 2018-05-22
  • 2020-08-27
  • 2019-06-09
  • 2020-02-11
  • 2017-09-24
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多