我正在尝试使用以下代码获取访问令牌。
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。知道我可能会错过什么吗?
在我的本地环境中,我获得了令牌,但基于我的本地帐户。
我在 Azure 门户中创建了一个 用户管理的身份:
注意:为了使用用户托管标识,您需要将代码部署到任何 Azure 资源(Web 应用程序、函数应用程序、VM 等),但请确保将用户托管标识添加到同一资源您的代码所在的位置。
确保将 用户管理身份 添加到 Function 应用程序:
在我的例子中,我创建了独立的函数应用程序并在其中部署了以下代码:
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;
}
}
}
现在,当我在 Function 应用程序中运行该函数时,我能够成功生成令牌:
解码后的令牌: