我一直在尝试设置,以便能够使用托管身份进行授权,并能够在本地以及在应用程序部署到Azure时从我的Azure函数项目发送消息。
我目前所做的是:
1.已在Azure中创建托管标识:
1.已将我的功能应用程序命名空间与托管身份以及我的工作帐户分配到的贡献者开发人员组关联。我还为托管身份资源分配了我想要使用的服务总线的角色。关于角色分配,我尝试了多个角色(以下详细介绍):
- 关联功能应用:**
- 关联功能应用:**
- 托管标识中的已分配组:**
- 托管标识中的已分配组:**
- 角色分配托管身份到Servicebus资源:**
- 角色分配托管身份到Servicebus资源:**
注意:我已经尝试了3个角色,你可以看到:"Azure服务总线数据发送方"、"Azure服务总线数据所有者"和"所有者"。*
1.我已经在应用程序的代码中实现了授权部分:
我的Servicebus相关代码:
Startup.cs:
services.AddSingleton<IServiceBusDataFactory>(new ServiceBusDataFactory("testJohnSb.servicebus.windows.net", new DefaultAzureCredential()));
类别:
public class ServiceBusDataFactory : IAsyncDisposable, IServiceBusDataFactory
{
private readonly ServiceBusClient _client;
private readonly ConcurrentDictionary<string, ServiceBusSender> _senders = new ConcurrentDictionary<string, ServiceBusSender>();
private readonly ConcurrentDictionary<string, ServiceBusReceiver> _receivers = new ConcurrentDictionary<string, ServiceBusReceiver>();
public ServiceBusDataFactory(string fullyQualifiedNamespace, TokenCredential credential) => _client = new ServiceBusClient(fullyQualifiedNamespace, credential);
public ServiceBusDataFactory(string connectionString) => _client = new ServiceBusClient(connectionString);
public ServiceBusSender GetSender(string entity) =>
_senders.GetOrAdd(entity, entity => _client.CreateSender(entity));
public ServiceBusReceiver GetReceiver(string entity) =>
_receivers.GetOrAdd(entity, entity => _client.CreateReceiver(entity));
public async ValueTask DisposeAsync()
{
await _client.DisposeAsync().ConfigureAwait(false);
GC.SuppressFinalize(this);
}
}
但当我尝试工作流程时,我得到:
未经授权的访问。需要"发送"声明才能执行此操作。资源:服务商://测试约翰服务商。
我错过什么了吗?
- 东部内陆发展中国家**
经过一些测试,这是我发现:
- (注:如果有人不同意下面的信息,请让我知道,我会更正它。)*
简短版本:使用"用户分配的托管身份"***从Azure中的已部署/已发布状态进行身份验证并能够在本地使用该身份无法仅使用分配给(在本例中)能够向其发送消息的服务总线的"用户分配的托管身份"角色。
这是我曾经尝试过的:
使用与上面相同的设置,并在@juunas答案的注解部分提到。
1.首先,我仅将"用户分配的托管身份"作为"Azure Servicebus数据发送方"角色分配给Servicebus。**导致:**我的Function应用程序能够发送在Azure中发布的消息,但不能使用本地Visual Studio中的相同代码。
1.第二,将我的工作帐户角色分配为贡献者,我在Visual studio本地登录时的身份是"用户分配的托管身份"-资源,以为它会以某种方式"委托权限"(如果这是正确的说法),并授权我能够使用托管身份向服务总线发送消息,该身份已在服务总线中分配了角色"Azure服务总线数据发送方"。**导致:**我的函数应用程序仍然能够发送在azure中发布的消息,并且仍然不使用本地Visual Studio中的相同代码。
1.第三,我最后将我的工作帐户角色分配为"Azure Servicebus数据发送方",就像我之前对托管身份所做的那样。**结果:**我的函数应用和相同的本地函数应用项目都能够向servebus发送消息。
如果有人有幸让它在本地运行,请写信给我,如果我误解了什么,赖特甚至会解释我错在哪里,我会编辑这篇文章。
1条答案
按热度按时间exdqitrt1#
默认情况下,
DefaultAzureCredential
将仅尝试使用 * 系统分配的 * 受管身份,而不是用户分配的受管身份。但是,您可以为其指定用户分配的身份客户端ID: