用户分配的托管身份:未找到指定 ClientId/ResourceId/PrincipalId 的用户分配或委派托管身份

问题描述 投票:0回答:1

我正在尝试使用以下代码获取访问令牌。

private static async Task<string> GetJwtTokenUsingManagedIdentity(string clientId, string tennantId)
{
    string resource = "https://management.azure.com/.default";
    var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
    {
        ManagedIdentityClientId = clientId,
    });

    var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { resource });

    var token = await credential.GetTokenAsync(tokenRequestContext);

    return token.Token;
}

但我收到错误“没有为指定的 ClientId/ResourceId/PrincipalId 找到用户分配或委派的托管身份”。我正在传递用户分配的托管身份的 clientId。知道我可能会错过什么吗?

在我的本地环境中,我获得了令牌,但基于我的本地帐户。

下面是已分配角色的托管身份的屏幕截图。 enter image description here

c# azure azure-managed-identity azure-identity
1个回答
0
投票

我在 Azure 门户中创建了一个 用户管理的身份

enter image description here

注意:为了使用用户托管标识,您需要将代码部署到任何 Azure 资源(Web 应用程序、函数应用程序、VM 等),但请确保将用户托管标识添加到同一资源您的代码所在的位置。

确保将 用户管理身份 添加到 Function 应用程序:

enter image description here

在我的例子中,我创建了独立的函数应用程序并在其中部署了以下代码:

namespace rukfunctionapp
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function("Function1")]
        public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            string clientId = "ClientID";  // Replace with your actual UMI client ID
            string tenantId = "TenantID";  // Replace with your actual tenant ID
            string jwtToken = await GetJwtTokenUsingManagedIdentity(clientId, tenantId);

            // Return the token in the response
            return new OkObjectResult($"JWT Token: {jwtToken}");
        }

        
        private static async Task<string> GetJwtTokenUsingManagedIdentity(string clientId, string tenantId)
        {
            string resource = "https://management.azure.com/.default";  
            var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
            {
                ManagedIdentityClientId = clientId,  
            });

            var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { resource });

            
            var token = await credential.GetTokenAsync(tokenRequestContext);

            return token.Token;  
        }
    }
}

enter image description here

现在,当我在 Function 应用程序中运行该函数时,我能够成功生成令牌

enter image description here

解码后的令牌:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.