当前位置: 首页 > 知识库问答 >
问题:

授权用户访问azure blob

萧玮
2023-03-14

我正在通过adal节点库使用microsoft登录验证我的网页的用户。

adal-node有一个AuthenticationContext,我们可以使用获取JWT令牌。

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

现在的问题是,如何使用上述接收到的JWT令牌获取特定storageaccount/container/blob的RBAC角色?这可能吗?

或者我应该为此目的使用像azure-arm授权这样的库?我已经为每个存储帐户/容器/blob设置了RBAC角色,但是我没有找到任何关于如何为我的应用程序的每个登录用户获取这些角色的在线留档。

任何帮助都是无价的。

TL;DR我如何授权azure Blob?


共有1个答案

江德海
2023-03-14

根据我的研究,如果我们想使用Azure AD身份验证来访问Azure blob存储,我们需要为Azure存储帐户或容器分配Azure RABC角色。有关更多详细信息,请参阅此处。此外,我们可以使用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>"

欲了解更多信息,请阅读文章

如果您想使用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)。js公司

根据我的测试,如果您想将azure-arm-授权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)
                         });
                    });
               });
          }
     }
);

此外,如果您想知道如何使用passport azure ad获取角色分配,您可以使用passport azure ad获取ad访问令牌,然后html" target="_blank">调用azure rest API。关于如何实现它,您可以参考示例。

 类似资料:
  • 介绍 除了内置的 用户认证 服务之外, Lumen 还提供了用户授权和资源访问控制的方案。有很多种方法与辅助函数能帮你处理授权逻辑。 总的来说,Lumen 中的使用和 Laravel 大同小异,我们会在这个文档中指出不同的地方,完整的用户授权文档还需要查阅 Laravel 授权文档 。 与 Laravel 的不同 定义权限 与 Laravel 相比,Lumen 的用户授权的不同之处在于如何定义权限

  • 主要内容:权限类型说明授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。 在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下: 其中: priv_type 参数表示权限类型; columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表; database.table

  • 我对spring security&oauth2相当陌生。作为学习的一部分,我试图设置一个OAuth2授权服务器,并保护RESTendpoint免受未经授权的访问。 代码 资源服务器 ProductController.java 未经授权API可以正常工作 如果我们只使用权限(@preauthorize(“hasauthorize('...')”))进行授权,它可以正常工作 作用域在到达oauth

  • 认证(Authentication)是指任何识别用户身份的过程。授权(Authorization)是允许特定用户访问特定区域或信息的过程。 相关模块和指令 认证和授权涉及到三组模块。通常,你需要从每一组中选择至少一个模块。 认证类型模块(参见AuthType指令) mod_auth_basic mod_auth_digest 认证支持模块 mod_authn_alias mod_authn_ano

  • Kubernetes 从 1.6 开始支持基于角色的访问控制机制(Role-Based Access,RBAC),集群管理员可以对用户或服务账号的角色进行更精确的资源访问控制。在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角

  • 问题内容: 我看过许多类似的问题,因此表明我已经检查了基础知识。当然,这并不意味着我没有错过任何显而易见的东西。:-) 我的问题是:为什么我拒绝具有特权的用户访问权限,而我却已经在其中输入密码并被授予访问权限?(为了完整起见,我尝试输入错误的密码只是为了确保MySQL客户端在程序启动时拒绝我访问。) 背景: 通过ssh登录到运行MySQL服务器的计算机的外壳,我以root用户身份登录: 太棒了 我