Azure 服务总线 - 未经授权的访问。 'Send' 项声明需要执行此操作
Azure Service Bus - Unauthorized access. 'Send' claim(s) are required to perform this operation
我正在尝试从我的 Windows Service
应用程序访问 Azure Service Bus
Queue
。
我正在关注 this 示例。
我想使用 Azure Service Principal
来保护这个 Azure Service Bus
以下是我已经实施的步骤
- 在
Azure Ad
中注册名为 pc-shutdown-producer
的应用程序
代表我的 Windows Service
- 我创建了名为
shutdowncomputer
的 Azure service bus namespace
- 在
Access control (IAM)
中,我添加了具有以下值的 Role Assignment
- 角色 -
Azure Service Bus Data Owner
- 分配对 -
pc-shutdown-producer
的访问权限
据我所知,上述配置将使 pc-shutdown-producer
应用程序管理服务总线命名空间中的所有资源。
4.除此之外,我还提供了pc-shutdown-producer
委托API访问服务总线命名空间的权限。
下面是我的 C# 代码。
public async Task Init()
{
string authority = $"https://login.windows.net/{TenantId}";
ITokenProvider tokenProvider = TokenProvider.CreateAzureActiveDirectoryTokenProvider(AuthenticationCallback, authority);
var endpoint = new Uri($"sb://shutdowncomputer.servicebus.windows.net/");
var entityPath = "shutdownrequest";
var qc = new QueueClient(endpoint.ToString(), entityPath, tokenProvider);
Message m = new Message();
m.Body = Encoding.ASCII.GetBytes("{id: 1, name: 'hemant'}");
m.ContentType = "application/json";
try
{
await qc.SendAsync(m);
}
catch (Exception ex)
{
//I am getting exception here.
//Unauthorized access. 'Send' claim(s) are required to perform this operation.
throw ex;
}
}
private async Task<string> AuthenticationCallback(string audience, string authority, object state)
{
string accessToken = string.Empty;
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(AppId)
.WithAuthority(authority)
.WithClientSecret(Password)
.Build();
var serviceBusAudience = new Uri("https://servicebus.azure.net");
List<string> claims = new List<string>();
claims.Add($"{serviceBusAudience}/.default");
try
{
var result = await app.AcquireTokenForClient(claims.ToArray()).ExecuteAsync();
accessToken = result.AccessToken;
}
catch (Exception ex)
{
//No issue here.
Console.WriteLine(ex.Message);
}
//Successfully able to retrieve a token.
return accessToken ;
}
执行 Init()
后,我收到以下异常消息。
Unauthorized access. 'Send' claim(s) are required to perform this operation. Resource: 'sb://shutdowncomputer.servicebus.windows.net/shutdownrequest'. TrackingId:52c0eedcf19d4513a8ec105943859764_G12, SystemTracker:gateway7, Timestamp:2020-05-11T06:59:01
更新 1
根据@Carl Zhao 的建议,我已向管理员提供同意 pc-shutdown-producer
但仍然有同样的问题。
谢谢
权限不足,应添加管理员同意:
就我而言,错误具有误导性。
原因是配置文件中缺少密码(这发生在 Jenkins 测试代理中,它正在从其他未设置密码的文件中检索密码)。
如果我的密码有误,错误只是“试图执行未经授权的操作”。但是没有任何密码(例如空 属性 值),错误是“未经授权的访问。'Send' 声明需要执行此操作。”。
我正在尝试从我的 Windows Service
应用程序访问 Azure Service Bus
Queue
。
我正在关注 this 示例。
我想使用 Azure Service Principal
来保护这个 Azure Service Bus
以下是我已经实施的步骤
- 在
Azure Ad
中注册名为pc-shutdown-producer
的应用程序 代表我的Windows Service
- 我创建了名为
shutdowncomputer
的 Azure - 在
Access control (IAM)
中,我添加了具有以下值的Role Assignment
- 角色 -
Azure Service Bus Data Owner
- 分配对 -
pc-shutdown-producer
的访问权限
- 角色 -
service bus namespace
据我所知,上述配置将使 pc-shutdown-producer
应用程序管理服务总线命名空间中的所有资源。
4.除此之外,我还提供了pc-shutdown-producer
委托API访问服务总线命名空间的权限。
下面是我的 C# 代码。
public async Task Init()
{
string authority = $"https://login.windows.net/{TenantId}";
ITokenProvider tokenProvider = TokenProvider.CreateAzureActiveDirectoryTokenProvider(AuthenticationCallback, authority);
var endpoint = new Uri($"sb://shutdowncomputer.servicebus.windows.net/");
var entityPath = "shutdownrequest";
var qc = new QueueClient(endpoint.ToString(), entityPath, tokenProvider);
Message m = new Message();
m.Body = Encoding.ASCII.GetBytes("{id: 1, name: 'hemant'}");
m.ContentType = "application/json";
try
{
await qc.SendAsync(m);
}
catch (Exception ex)
{
//I am getting exception here.
//Unauthorized access. 'Send' claim(s) are required to perform this operation.
throw ex;
}
}
private async Task<string> AuthenticationCallback(string audience, string authority, object state)
{
string accessToken = string.Empty;
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(AppId)
.WithAuthority(authority)
.WithClientSecret(Password)
.Build();
var serviceBusAudience = new Uri("https://servicebus.azure.net");
List<string> claims = new List<string>();
claims.Add($"{serviceBusAudience}/.default");
try
{
var result = await app.AcquireTokenForClient(claims.ToArray()).ExecuteAsync();
accessToken = result.AccessToken;
}
catch (Exception ex)
{
//No issue here.
Console.WriteLine(ex.Message);
}
//Successfully able to retrieve a token.
return accessToken ;
}
执行 Init()
后,我收到以下异常消息。
Unauthorized access. 'Send' claim(s) are required to perform this operation. Resource: 'sb://shutdowncomputer.servicebus.windows.net/shutdownrequest'. TrackingId:52c0eedcf19d4513a8ec105943859764_G12, SystemTracker:gateway7, Timestamp:2020-05-11T06:59:01
更新 1
根据@Carl Zhao 的建议,我已向管理员提供同意 pc-shutdown-producer
但仍然有同样的问题。
谢谢
权限不足,应添加管理员同意:
就我而言,错误具有误导性。
原因是配置文件中缺少密码(这发生在 Jenkins 测试代理中,它正在从其他未设置密码的文件中检索密码)。
如果我的密码有误,错误只是“试图执行未经授权的操作”。但是没有任何密码(例如空 属性 值),错误是“未经授权的访问。'Send' 声明需要执行此操作。”。