Power Automate中通过Azure REST API获取Key Vault中secret的值

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复412或者20200517可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

使用Azure Key Vault来存储密钥等信息是个好选择,在Power Auotmate中如何获取呢?官方文档请参考 Azure REST API ReferenceAzure Key Vault REST API reference

在Power Automate中获取secret的值,最简单也最容易想到的是使用Azure Key Vault Connector中的Get secret来获取值。

 

 这个Action有两中连接方式,默认的Sign in这种方式来获取Secret的值,需要这个连接的账号有Get secret的权限。

当这个flow是被Power Apps调用的时候,会传递当前打开这个Power Apps的账号过来,一般没有权限,会报错。

如果我用另外一种方式,就是 Connect with Service Principal呢?

 

 这里需要先注册一个app并授权,登录 https://portal.azure.com/ 后,点击左侧导航栏的 Azure Active Directory ,然后选择【App registrations】 > 【New registration】。

 

我的设置如下:

 

 

然后添加一个Secret并保存下来。

 

 

但是如果添加API Permission的话只能添加代理权限,在我的场景下不是这个,因为Key Vault的权限只是授予了有限的几个账号,虽然我不用,但是我截图放在这儿。

 

 

我用另外的方法,到 Key Vault的界面来增加Access Policy。

 

 

我添加的界面如下,我只授予了Secret的Get权限,Principal 选择我前面新建的app:

 

 

完成添加后可以看到展示的权限如下:

 

 

使用 Connect with Service Principal 来连接,我的设置页面如下:

 

 我设置的如下:

 

  然后我用一个没有读取权限的普通账号打开这个Canvas App,这个app中的按钮调用了这个flow (FlowforPowerApps.Run()):

 

 

从调用记录来看会报错:

{
  "status": 403,
  "message": "Operation failed because client does not have permission to perform the operation on the key vault. Please check your permissions in the key vault access policies.\r\nclientRequestId: 1a3e5df9-adb7-48db-9523-1645a9f1d0f5",
  "error": {
    "message": "Operation failed because client does not have permission to perform the operation on the key vault. Please check your permissions in the key vault access policies."
  },
  "source": "keyvault-ea.azconn-ea.p.azurewebsites.net"
}
 
但是我如果换用一个对这个secret有get权限的用户来运行该canvas app并点击按钮,会运行正常。

 

那如何解决呢?可以通过Azure REST API来做,前面的app注册后,我用类似如下的请求可以获取到Token:

POST https://login.microsoftonline.com/9870b0d6-32be-4bbc-9cd7-01d0eed5e8a2/oauth2/token

Request Header: Content-Type application/x-www-form-urlencoded

Request Body: client_id=a718371b-ddc3-4432-b503-f07786df1c35&resource=https://vault.azure.net&client_secret=4om6gLfwR8.pEDmcifN-O85lM6OA0Q3o..&grant_type=client_credentials

 

 

然后用Token发起如下请求就可以获取到 Secret 的value:

GET https://luoyongkv.vault.azure.net/secrets/Secret?api-version=7.0

Request Header:  Authorization Bearer {tokenvalue}

 

如果这两个请求用flow来做的话,用如下三个Action即可:

第一步是HTTP这个Connector中的HTTP action:

  

设置如下:

  

第二步是 Data Operation 这个Connector中 Parse JSON action:

  

 设置如下,当然我这里使用了返回的JSON示例来生成Schema。

  

第三步是HTTP这个Connector中的HTTP action,设置如下,其中用到的公式是:concat('Bearer ',body('Parse_JSON')?['access_token']) 

 

 在Power Automate中使用此种方法有个好处,就是不需要使用Power Apps的用户有读取secret的权限。

posted @ 2020-05-17 16:16  微软MVP(15-18)罗勇  阅读(817)  评论(0编辑  收藏  举报