使用Adal代表用户访问Azure KeyVault

时间:2015-05-07 09:08:20

标签: azure azure-active-directory azure-keyvault

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

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上创建一个可以与keyvault对话的单独应用程序。我想用自己的ID与keyvault交谈,但我无法弄清楚如何获得keyvault客户端所需的访问令牌。

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

我尝试过从公共端点的初始令牌请求中获取访问权限或id令牌。有没有人建议如何代表我自己的身份证而不是应用程序与azure密钥保管库交谈?

更新

所以看着标题我发现我的令牌是缺少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"
        }
      ]
    }
  ],

我如何知道用于范围的guid和用于keyvault的resourceAppId?

临时解决方案

在我知道如何获取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 在使用powershells clientid之前,请在博客文章中阅读@bradygaster评论。

2 个答案:

答案 0 :(得分:2)

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

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

如果这不起作用,您可以通过访问the old portal,导航到AAD,您的AAD租户,您的应用程序以及添加&#34; Azure Key Vault&#,以老式方式执行此操作34;根据&#34;对其他应用程序的权限&#34; &#34;配置&#34;的部分标签

答案 1 :(得分:1)

以下是您需要做的事情:

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

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

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

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

相关问题