授权用户访问天蓝色Blob

时间:2020-01-08 12:35:49

标签: azure azure-active-directory azure-storage azure-storage-blobs azure-resource-manager

我正在通过 adal-node 库使用 Microsoft登录名对用户的网页进行身份验证。

adal-node 有一个 AuthenticationContext ,我们可以从中获得 JWT令牌 ,使用 acquireTokenWithAuthorizationCode

因此,我的活动目录应用程序的用户现在可以使用其Microsoft帐户成功登录。

现在,问题是如何使用上面收到的 JWT令牌 来获得特定存储帐户/容器/ blob 的RBAC角色?那有可能吗?

或者我是否应该为此目的使用像 azure-arm-authorization 这样的库?我已经为每个 storageaccount / container / blob 设置了RBAC角色,但是我没有找到有关如何为我的应用程序的每个登录用户获取这些角色的在线文档。

任何帮助都是无价的。

TL; DR 如何授权天蓝色斑点?

1 个答案:

答案 0 :(得分:2)

根据我的研究,如果我们要使用Azure AD身份验证访问Azure Blob存储,则需要为Azure存储帐户或容器分配Azure RABC角色。有关更多详细信息,请参阅here。此外,我们可以使用Azure CLI分配角色并获取角色分配。

例如

# assign role
az role assignment create \
    --role "Storage Blob Data Contributor" \
    --assignee <email> \
    --scope "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/blobServices/default/containers/<container>"


# list role assignment of the resource
az role assignment list --scope "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/blobServices/default/containers/<container>"

有关更多信息,请阅读article


Update1

如果要使用nodejs sdk获取角色分配,请参考以下代码

const authorizationManagement = require('azure-arm-authorization');
const msrestAzure = require('ms-rest-azure');

const scope = '/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/blobServices/default/containers/<container>';
const subscriptionId = 'e5b0fcfa-e859-43f3-8d84-5e5fe29f4c68';

msrestAzure.interactiveLogin().then(credentials => {
 const client = new authorizationManagement(credentials, subscriptionId);
 client.roleAssignments.listForScope(scope).then(result => {
    result.forEach(element => { 
       
        client.roleDefinitions.getById(element.roleDefinitionId).then(result => {
             console.log("principal ID: "+ element.principalId+"\nrole name: "+result.roleName)
        });
      }); 
 });
})

有关更多详细信息,请参阅Get access control list (IAM) of a resource group in Node.js


Update2

根据我的测试,如果您想将azure-arm-authorizationadal-node一起使用。请参考以下代码

const authorizationManagement = require('azure-arm-authorization');
const TokenCredentials = require('ms-rest').TokenCredentials
const adal = require('adal-node').AuthenticationContext;
const scope = '/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/blobServices/default/containers/<container>';
const subscriptionId = 'e5b0fcfa-e859-43f3-8d84-5e5fe29f4c68';

// use service principal to get access token with adal-node
/*
  If you do not have a  service principal, you can use the following Azure CLI command(https://docs.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az-ad-sp-create-for-rbac) to create it 
    az ad sp create-for-rbac -n "MyApp" --role contributor 
    

*/ 
const tenant = 'your-tenant-id';
const authorityUrl = "https://login.microsoftonline.com/" + tenant;
const clientId = 'your-client-id';
const clientSecret = 'your-client-secret';
const resource = 'https://management.azure.com/';
const context = new adal(authorityUrl);
context.acquireTokenWithClientCredentials(
     resource,
     clientId,
     clientSecret,
     (err, tokenResponse) => {
          if (err) {
               console.log(`Token generation failed due to ${err}`);
          } else {

               const credentials = new TokenCredentials(tokenResponse.accessToken);

               const client = new authorizationManagement(credentials, subscriptionId);
               client.roleAssignments.listForScope(scope).then(result => {
                    result.forEach(element => {

                         client.roleDefinitions.getById(element.roleDefinitionId).then(result => {
                              console.log("principal ID: " + element.principalId + "\nrole name: " + result.roleName)
                         });
                    });
               });
          }
     }
);

enter image description here

除了要了解如何使用passport-azure-ad获取角色分配之外,还可以使用passport-azure-ad获取AD访问令牌,然后调用Azure rest API。关于如何实现,可以参考sample