You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Get-AzAccessToken指定不同TenantId始终返回相同令牌问题

问题原因
  • 当你使用Connect-AzAccount -AccessToken <静态令牌>的方式登录Azure时,Az模块不会激活内置的令牌自动刷新、跨租户兑换逻辑,只会将你传入的初始令牌写入本地缓存。此时调用Get-AzAccessToken即使传入-TenantId参数,模块也不会实际向AAD发起新的令牌请求,会直接返回缓存中的初始OBO令牌,这是Az PowerShell的默认设计行为,并非AAD令牌接口故障。
  • 你最初通过OBO流获取的令牌是向固定的主租户令牌端点申请的,该令牌仅在主租户范围内有效,本身不具备跨租户访问能力。OBO流不支持单端点签发多租户可用的令牌,访问不同租户必须单独向对应租户的AAD端点发起令牌申请,无法通过Az模块的自动缓存逻辑完成兑换。
  • 请求头中获取的x-ms-token-aad-id-token作为OBO断言是可以跨租户使用的,前提是目标租户允许当前登录用户、以及函数对应的AAD应用注册访问该租户资源。
排查思路
  • 解码初始获取的OBO访问令牌,检查tid声明字段,确认该令牌的签发租户确实为你最初请求的主租户,验证令牌本身不包含其他租户的授权信息。
  • 跳过Get-AzAccessToken命令,手动构造向目标租户端点发起的OBO请求,将请求地址替换为https://login.microsoftonline.com/<目标租户ID>/oauth2/v2.0/token,其余参数保持不变,验证是否可以正常获取目标租户的有效令牌,排除断言本身的权限问题。
  • 检查Azure Function环境中安装的Az.Accounts模块版本,低于2.10.0的版本存在指定-TenantId参数时错误返回缓存令牌的已知问题,可先升级到最新稳定版排除版本bug,但需要注意:即使升级版本,静态AccessToken登录模式下模块依然不会自动发起跨租户OBO请求。
  • 确认函数对应的AAD应用注册是否配置为多租户应用,若应用为单租户模式,无法在其他租户中完成令牌签发。
解决方案

遍历租户列表时,不要调用Get-AzAccessToken尝试获取跨租户令牌,手动为每个目标租户发起OBO流请求获取对应访问令牌即可,参考代码如下:

foreach ($tenant in $allTenants) {
    # 拼接当前租户对应的AAD令牌端点
    $targetTokenEndpoint = "https://login.microsoftonline.com/$($tenant.Id)/oauth2/v2.0/token"
    $tenantOboRequestBody = @{
        grant_type          = "urn:ietf:params:oauth:grant-type:jwt-bearer"
        client_id           = $clientId
        client_secret       = $clientSecret
        scope               = "https://management.azure.com/user_impersonation"
        requested_token_use = "on_behalf_of"
        assertion           = $assertion
    }

    try {
        $tenantTokenResponse = Invoke-RestMethod -Uri $targetTokenEndpoint -Method Post -Body $tenantOboRequestBody -ContentType "application/x-www-form-urlencoded"
        $tenantAccessToken = $tenantTokenResponse.access_token
        # 切换Az上下文到当前租户,执行后续资源操作
        Connect-AzAccount -AccessToken $tenantAccessToken -AccountId $accountId -Tenant $tenant.Id | Out-Null
        
        # 此处编写对应租户的业务逻辑
    }
    catch {
        # 处理无权限、租户未授权应用等异常场景
        Write-Warning "租户 $($tenant.Id) 令牌获取失败: $($_.Exception.Message)"
    }
}
  • 如果需要减少重复的上下文切换开销,可以在拿到每个租户的令牌后,手动维护不同租户对应的Az上下文对象,按需切换即可。
  • 若目标租户为外部来宾租户,需要提前确认当前登录用户在目标租户中已经激活对应权限,且租户管理员已经同意函数应用的user_impersonation权限,否则OBO请求会返回授权错误。

内容的提问来源于stack exchange,提问作者Meelamri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:18:20