12

以下是在控制台应用程序和 ClientID 中,RedirectUri 来自天蓝色活动目录中创建的本机应用程序。

var authContext = new AuthenticationContext(string.Format("https://login.windows.net/{0}","common"),new FileCache());
var token = authContext.AcquireToken("https://management.core.windows.net/", ClientID, RedirectUri, PromptBehavior.Auto);

我现在有了与管理 api 交谈的令牌。

 using (var client = new KeyVaultManagementClient(new TokenCloudCredentials(SubscriptionId, token.AccessToken)))
 {
     var a = client.Vaults.List(resourceGroup, 10);
     foreach(var vault in a.Vaults)
     {
           var vaultInfo = client.Vaults.Get(resourceGroup, vault.Name);
           Console.WriteLine(JsonConvert.SerializeObject(vaultInfo.Vault, Formatting.Indented));
           //Verifying that the AccessPolicies contains my object id (pasting idtoken into jwt.io and compare with oid claim) Success.

           // Now its time to talk with keyvault
           var keyvault = new KeyVaultClient(GetAccessTokenAsync);
           var secrets = keyvault.GetSecretsAsync(vaultInfo.Vault.Properties.VaultUri).GetAwaiter().GetResult();

     }

 }


 private static Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
 {
         var context = new AuthenticationContext(authority, new FileCache());
        var result = context.AcquireToken(resource, new ClientCredential(AppClientId,AppKey));

        return Task.FromResult(result.AccessToken);

 }

以上工作,但要求我在我的 AD 上创建一个可以与密钥库对话的单独应用程序。我想使用自己的 ID 与 keyvault 交谈,但我不知道如何获取 keyvault 客户端所需的访问令牌。

我是否需要更新 azure manuel 上的清单并添加允许我的控制台应用程序代表用户获取 keyvault 的令牌?需要在 GetAccessTokenAsync 中更改哪些代码才能使其工作。

我已经尝试只给它来自公共端点的初始令牌请求的访问或 ID 令牌。有人对如何代表我自己的 id 而不是应用程序与 azure key vault 交谈有什么建议吗?

更新

因此,查看标头我发现我的令牌缺少 vault.azure.net 作为资源,因此尝试:

var testtoken = authContext.AcquireToken("https://vault.azure.net", ClientID, RedirectUri);

给出以下错误:

AADSTS65005:客户端应用程序已请求访问资源“ https://vault.azure.net ”。此请求失败,因为客户端未在其 requiredResourceAccess 列表中指定此资源。

并查看当前清单:

"requiredResourceAccess": [
    {
      "resourceAppId": "797f4846-ba00-4fd7-ba43-dac1f8f63013",
      "resourceAccess": [
        {
          "id": "41094075-9dad-400e-a0bd-54e686782033",
          "type": "Scope"
        }
      ]
    },
    {
      "resourceAppId": "00000002-0000-0000-c000-000000000000",
      "resourceAccess": [
        {
          "id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6",
          "type": "Scope"
        }
      ]
    }
  ],

我怎么知道 keyvault 的范围和 resourceAppId 使用哪些 guid?

临时解决方案

在我知道如何获取 resourceAppId 和相关信息之前,我一直在使用模拟 powershell 工具的旧技巧。

 var vaultToken = authContext.AcquireToken("https://vault.azure.net", "1950a258-227b-4e31-a9cf-717495945fc2", new Uri("urn:ietf:wg:oauth:2.0:oob"));
 var keyvault = new KeyVaultClient((_, b, c) => Task.FromResult(vaultToken.AccessToken));    
 var secrets = keyvault.GetSecretsAsync(vaultInfo.Vault.Properties.VaultUri).GetAwaiter().GetResult();

来源:http : //www.s-innovations.net/Blog/2014/02/12/Controlling-the-login-flow-when-using-ADAL-for-WAML 请在之前的博客文章中阅读@bradygaster 评论使用 powershells 客户端 ID。

4

2 回答 2

2

你在正确的轨道上!您需要将 AAD 配置为能够专门授权用户访问 KeyVault。尝试将以下内容添加到您的清单中。

{
      "resourceAppId": "cfa8b339-82a2-471a-a3c9-0fc0be7a4093",
      "resourceAccess": [
        {
          "id": "f53da476-18e3-4152-8e01-aec403e6edc0",
          "type": "Scope"
        }
      ]
}

如果这不起作用,您可以通过访问旧门户、导航到 AAD、您的 AAD 租户、您的应用程序并在“对其他应用程序的权限”部分下添加“Azure Key Vault”来执行此操作。 “配置”选项卡。

于 2017-01-12T00:55:30.060 回答
1

这是您需要做的:

  • 创建服务主体
  • 在 Azure AD 中注册
  • 授予它对 Azure KeyVault API 的访问权限

这些步骤记录在去年 9 月的 Azure 文章中

https://blogs.technet.microsoft.com/kv/2016/09/17/accessing-key-vault-from-a-native-application/

本文介绍如何执行上述步骤以从本机应用程序(而不是服务应用程序)以编程方式访问 Azure KeyVault,而不必依赖 @benv 提到的 Azure Powershell 技巧。

于 2017-03-02T00:21:59.180 回答