azure - 授权用户进行 azure blob 访问
问题描述
我正在通过adal-node库使用microsoft 登录对用户进行身份验证。
adal-node有一个AuthenticationContext
我们可以从中获取JWT 令牌的acquireTokenWithAuthorizationCode
.
因此,我的 Active Directory 应用程序的用户现在可以使用他们的 Microsoft 帐户成功登录。
现在,问题是如何使用上面收到的JWT Token获取特定storageaccount/container/blob的 RBAC 角色?这甚至可能吗?
或者我应该为此目的使用像azure-arm-authorization这样的库吗?我已经为每个storageaccount/container/blob设置了 RBAC 角色,但是我没有找到任何关于如何为我的应用程序的每个登录用户获取这些角色的在线文档。
任何帮助都是无价的。
TL;DR我如何授权 azure blob?
解决方案
根据我的研究,如果我们想使用 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>"
欲了解更多信息,请阅读文章
更新1
如果想使用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)
});
});
});
})
更多详情请参考Node.js中获取资源组的访问控制列表(IAM)
更新2
根据我的测试,如果你想使用azure-arm-authorization
with 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 访问令牌,然后调用Azure rest API。关于如何实现,可以参考示例。
推荐阅读
- node.js - 如何让快递服务器一次只服务一个 API 请求
- docker - 自定义使用 docker stack deploy 创建的 docker 服务名称
- haskell - 在 Liquid Haskell 中定义度量
- servicestack - 使用 Castle.Windsor 将 ServiceStack 从 4.x 升级到 5.7
- machine-learning - 在 Keras 中,什么是“密集”层和“辍学”层?
- python - Python:如何将多个 excel IF 条件转换为 Python 编码?
- r - 获取通过重采样计算的多个回归系数值
- mongodb - MongoDB Mongoose:一次调用从两个集合中获取数据
- python - python3.7.5:round() 在看似相同的情况下表现不同?
- javascript - 输入范围缩放后如何在大图像上拖动和平移?