无法获取具有应用程序角色的托管身份的访问令牌

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

我正在尝试将应用程序角色分配给我的函数应用程序的系统分配的托管标识。

我相信我已遵循所有必需的步骤,但我的访问令牌(通过 DefaultAzureCredential() 获取)仍然不包含所需的角色 (Mail.Send)。

这是我所做的:

  1. 我创建了一个应用程序注册并添加了 Microsoft Graph Mail.Send 权限,类型为:应用程序并获得了管理员同意。

  2. 我创建了一个应用程序角色来使用 Mail.Send ...... 允许的成员类型:应用程序、 值:邮件发送, 状态:已启用。

  3. 我将该角色分配给我的函数应用程序的托管标识。我按照这些说明使用 Azure CLI 完成了此操作。然后,我可以确认该权限是否显示在门户中我的托管身份的权限下: 声明值:Mail.Send, 类型: 应用程序, 授予方式:管理员同意, 授予者:管理员。

azure azure-functions microsoft-graph-api azure-managed-identity
1个回答
0
投票

我创建了一个功能应用程序并启用了系统分配的托管身份。

使用下面的 PowerShell 脚本将 Send.Mail 角色分配给功能应用程序的系统管理身份。

Connect-AzureAD -TenantId <Tenant_ID>

$TenantID="<Tenant_ID>"
$GraphAppId = "00000003-0000-0000-c000-000000000000" 
$DisplayNameOfMSI="Display Name of Managed Identity"
$PermissionName = "Mail.Send"

$ObjectId= "Object ID of managed identity"
Start-Sleep -Seconds 10
$GraphServicePrincipal = Get-AzureADServicePrincipal -Filter "appId eq '$GraphAppId'"

New-AzureAdServiceAppRoleAssignment -ObjectId <Object_ID> -PrincipalId <Principal_ID> -ResourceId $GraphServicePrincipal.ObjectId -Id <AppRole_Id>

enter image description here

用于获取具有应用程序角色的托管身份的访问令牌的功能代码。

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 jwtToken = await GetJwtTokenUsingSystemManagedIdentity();
        return new OkObjectResult($"JWT Token: {jwtToken}");
    }

    private static async Task<string> GetJwtTokenUsingSystemManagedIdentity()
    {
        string resource = "https://graph.microsoft.com/.default"; 
        var credential = new DefaultAzureCredential();  

        var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { resource });
        var token = await credential.GetTokenAsync(tokenRequestContext);
        
        return token.Token;  
    }
}
Connected! You are now viewing logs of Function runs in the current Code + Test panel. To see all the logs for this Function, please go to 'Logs' from the Function menu.
2025-01-27T08:40:20Z   [Information]   Executing 'Functions.Function1' (Reason='This function was programmatically called via the host APIs.', Id=394cf91b-4b2c-4335-9d5a-33fab65735ad)
2025-01-27T08:40:21Z   [Information]   C# HTTP trigger function processed a request.
2025-01-27T08:40:21Z   [Information]   Executing OkObjectResult, writing value of type 'System.String'.
2025-01-27T08:40:22Z   [Information]   Executed 'Functions.Function1' (Succeeded, Id=394cf91b-4b2c-4335-9d5a-33fab65735ad, Duration=2002ms)

能够在functionapp中生成Access token:

enter image description here

解码访问令牌并能够看到分配的角色

Mail.Send
:

enter image description here

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.