Авторизуйте пользователя для доступа к блобу azure - PullRequest
2 голосов
/ 08 января 2020

Я аутентифицирую пользователей на своей веб-странице с помощью входа в Microsoft через adal-node .

adal-node имеет AuthenticationContext, из которого мы можем получить токен JWT , используя acquireTokenWithAuthorizationCode.

Таким образом, пользователи моего приложения активного каталога теперь могут успешно войти в систему со своими учетными записями Microsoft.

Теперь вопрос заключается в том, как получить свои роли RBA C для указанных c . учетная запись хранения / контейнер / блоб с использованием полученного выше токен JWT ? Это вообще возможно?

Или я должен использовать для этой цели библиотеку типа azure -arm-authorization ? Я установил роли RBA C для каждого storageaccount / container / blob , но я не нахожу онлайн-документации о том, как получить эти роли для каждого зарегистрированного пользователя моего приложения.

Любая помощь будет неоценимой.

TL; DR Как авторизовать azure BLOB-объектов?

1 Ответ

1 голос
/ 09 января 2020

Согласно моим исследованиям, если мы хотим использовать Azure Аутентификацию AD для доступа к хранилищу BLOB-объектов Azure, нам нужно назначить роль Azure RAB C для Azure учетной записи или контейнера хранения. Для более подробной информации, пожалуйста, обратитесь к здесь . Кроме того, мы можем использовать 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>"

Для получения дополнительной информации, пожалуйста, прочитайте статью


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)
        });
      }); 
 });
})

Для получения более подробной информации, пожалуйста, обратитесь к Получить список управления доступом (IAM) группы ресурсов в Node.js


Update2

Согласно моему тесту, если вы хотите использовать azure-arm-authorization с adal-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

Кроме того, если вы хотите знать, как использовать паспорт- azure -ад, чтобы получить назначение роли , вы можете использовать passport- azure -ad, чтобы получить токен доступа AD, затем вызвать Azure rest API . Относительно того, как это реализовать, вы можете обратиться к sample .

...