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

使用用户分配的托管标识进行Azure服务总线身份验证

臧烨烁
2023-03-14

我们需要从Azure应用程序服务和Azure功能运行访问Azure服务总线(ASB)的应用程序。我们需要使用用户指定的身份进行身份验证。我们编写以下代码,用于系统分配的标识,但不用于用户分配的标识:

var tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();
var managementClient = new ManagementClient(serviceBusEndpoint, tokenProvider);

if(await managementClient.QueueExistsAsync(queueName))
{
    return new OkObjectResult($"Queue with name {queueName} exists.");
}
else
{
    return new OkObjectResult($"Queue with name {queueName} doesn't exist.");
}

引发此错误:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried to get token using Managed Service Identity. Access token could not be acquired. MSI ResponseCode: BadRequest, Response: {"StatusCode":400,"Message":"No MSI found for specified ClientId/ResourceId.","CorrelationId":"dd2bcf6c-6f1d-489e-b178-ca6007502841"}
Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Visual Studio Token provider file not found at "D:\local\LocalAppData\.IdentityService\AzureServiceAuth\tokenprovider.json"
Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. 'az' is not recognized as an internal or external command,
operable program or batch file.


   at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsyncImpl(String authority, String resource, String scope)
   at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsync(String resource, String tenantId)
   at Microsoft.Azure.ServiceBus.Primitives.ManagedIdentityTokenProvider.GetTokenAsync(String appliesTo, TimeSpan timeout)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.GetToken(String requestUri)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.SendHttpRequest(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.GetEntity(String path, String query, Boolean enrich, CancellationToken cancellationToken)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.GetQueueAsync(String queuePath, CancellationToken cancellationToken)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.QueueExistsAsync(String queuePath, CancellationToken cancellationToken)

所以核心错误是找不到指定ClientId/ResourceId的MSI 。看起来我们需要指定客户端id。然后我们发现https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/identity/Azure.Identity使用ManagedIdentityCredential,我们可以指定客户端id,但还没有弄清楚如何将其用于ASB。

另一个选项是使用HTTP GET请求到MSI\uendpoint,如下所述https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?context=azure/active-目录/托管标识azure资源/上下文/msi上下文

共有3个答案

澹台新知
2023-03-14

从今天开始,我们可以让用户分配使用以下代码。

var managedCredential = new ManagedIdentityCredential(userAssignedIdentityAppId);
var accessToken = await _managedCredential.GetTokenAsync(
                        new TokenRequestContext(
                            new[] { "https://servicebus.azure.net" })).ConfigureAwait(false);

它适用于<代码>“https://servicebus.azure.net/.default“

子车安和
2023-03-14

我是AzureSDK团队的一员。我们正在统一所有Azure SDK:https://aka.ms/azsdkpackages,但还没有新的服务总线SDK。

我没有尝试使用TokenProvider API使用用户分配的身份,但我知道它可以与新的DefaultAzureCredential对象一起使用,该对象将在您的环境中搜索Cred,并自动拾取托管身份endpoint。您可以在此处阅读更多信息:https://docs.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-点网

但是,您不能直接使用DefaultAzureCredential,因为ServiceBus接受ITokenProvider。

同时,您可以使用我创建的这个适配器,这只是一个权宜之计,直到我们有了服务总线SDK。

>

  • 将Azure。标识和Azure。核心nuget包添加到您的项目中。

    将此文件复制到您的项目:https://github.com/jongio/azidext/blob/master/net/JonGallant.Azure.Identity.Extensions/DefaultAzureServiceBusCredential.cs

    下面是一个示例用法https://github.com/jongio/azidext/blob/master/net/JonGallant.Azure.Identity.Extensions.Tests/ServiceBus/ServiceBusTests.cs

    可以使用以下环境变量设置客户端id、机密和租户id:

    AZURE_CLIENT_ID
    
    AZURE_CLIENT_SECRET
    
    AZURE_TENANT_ID
    

    如果您必须使用TokenProvider,并且不想使用权宜之计,那么请让我知道,我可以进一步研究它。

  • 晏兴发
    2023-03-14

    TokenProvider。CreateManagedIdentityTokenProvider依赖于Microsoft。蔚蓝色的服务。用于实现托管标识的AppAuthentication。

    Microsoft 1.2.1版支持用户分配的托管标识。Azure。服务。应用身份验证。文档可以在此处找到。

    因此,您必须做两件事才能使用您已经拥有的代码:

    1.更新Microsoft的版本。Azure。服务。应用身份验证到最新

    2.在AppService的App设置中将AzureServicesAuthConnectionString设置为RunAs=App; AppId={用户分配身份的ClientId}。例如RunAs=App; AppId=587f16c8-81ed-41c7-b19a-9ded0dbe2ca2

    完成这两个步骤后,您的代码应该使用用户分配的托管标识。我用一个应用程序服务试用了一下,效果很好。

     类似资料:
    • Azure服务总线支持托管标识访问,但我发现向队列发送消息的唯一方法是使用这种需要代码和服务总线SDK的方法: 来源:https://github.com/Azure-Samples/app-service-msi-servicebus-dotnethttps://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-ma

    • 当尝试在Azure Gov中获取服务总线的托管标识令牌时,我尝试使用资源:https://servicebus.usgovcloudapi.net/而不是像商业(https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-managed-service-identity)那样https://servicebus.

    • 我已经尝试按照本教程来验证我的服务总线对,但是,我得到了401。 我在设置中使用以下代码: 然后我这样称呼SB客户: 当我调用我得到一个401错误: 失败:Azure Messaging ServiceBus[82]为标识符myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a创建发送链接时发生异常。错误消息:“系统。UnauthorizedAccessExcep

    • 我在Azure中设置了两个应用程序服务。”父级和子级都公开APIendpoint。 子节点有endpointGet。 父节点有endpoint“获取”和“获取儿童”(使用HttpClient在儿童上调用“获取”)。 我希望所有子endpoint都需要通过托管身份和AAD进行身份验证,并且我希望所有父endpoint都允许匿名。但是在Azure中,我希望将父应用服务设置为具有调用子应用服务的权限。因

    • 现在我正在使用AAD应用程序使服务成为= AAD应用程序 流程如下所示: 服务A:从托管标识获取令牌 服务A:转到KeyVault,出示令牌并获取AAD应用程序的秘密 服务A:转到AAD,提供一个秘密并为特定资源请求一个令牌 服务A:拨打服务B 服务B:验证令牌和资源 我想知道是否可以向我的服务注册托管标识,因此如果提供托管标识令牌,则服务B可以信任服务A。类似于这样: 服务A:从托管身份获取令牌

    • 我试图通过ARM模板将Service Bus Receiver角色添加到用户分配的托管标识中。 i、 e.这一作用。https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#azure-服务总线数据接收器 这是模板 它返回这个错误。 状态消息:不允许更新租户ID、应用程序ID、主体ID和作用域。(