寻求交互式SSO方案:一次登录访问MS Graph与存储账户
解决方案:一次交互式登录访问MS Graph与Azure存储账户
问题根源
你之前的操作中,Connect-AzAccount默认仅请求Azure管理平台的权限范围,通过Get-AzAccessToken获取的MS Graph令牌只包含基础权限,缺少Intune相关的DeviceManagementApps.Read.All等必要范围,导致Graph API查询失败;反向操作时的令牌类型差异是因为两个模块返回的令牌封装对象不同,但核心的令牌字符串是通用的,只是模块间的类型不兼容。
可行方案(无需证书/应用注册)
方案1:在Az登录时指定所需的MS Graph权限范围
通过Connect-AzAccount的-Scopes参数,在交互式登录阶段同时请求Azure管理和MS Graph的必要权限,这样后续获取的令牌会包含所有指定范围:
- 确定所需权限:针对你的Intune应用查询场景,需要
DeviceManagementApps.Read.All权限(若需写入则对应DeviceManagementApps.ReadWrite.All)。 - 带权限范围登录:
# 同时请求Azure管理默认权限和MS Graph的Intune相关权限 Connect-AzAccount -Scopes "https://management.azure.com/.default", "DeviceManagementApps.Read.All"
- 分别获取对应资源的令牌:
# 获取Azure存储账户的访问令牌 $storageToken = (Get-AzAccessToken -ResourceTypeName Storage).Token # 获取包含Intune权限的MS Graph令牌 $graphToken = (Get-AzAccessToken -ResourceTypeName MSGraph).Token
- 使用Graph令牌执行查询:
Connect-MgGraph -AccessToken $graphToken $GraphURI = "https://graph.microsoft.com/beta/deviceAppManagement/mobileApps/?`$filter=contains(displayName, '7-Zip - 19.00')" $GraphResponse = Invoke-RestMethod -Uri $GraphURI -Method "GET" -ErrorAction Stop
方案2:使用MSAL.PS模块统一获取多资源令牌
如果偏好更灵活的令牌管理,可以使用MSAL.PS模块直接进行交互式登录,获取可用于多个资源的令牌:
- 安装模块(若未安装):
Install-Module -Name MSAL.PS -Scope CurrentUser -Force
- 交互式登录并获取令牌:
# 指定客户端ID为Az CLI的默认ID(无需自定义应用注册) $clientId = "04b07795-8ddb-461a-bbee-02f9e1bf7b46" # 同时请求Azure存储和MS Graph的权限 $scopes = @("https://storage.azure.com/.default", "DeviceManagementApps.Read.All") # 交互式登录获取令牌 $authResult = Get-MsalToken -ClientId $clientId -Scopes $scopes -Interactive
- 提取令牌分别使用:
# 存储账户令牌可用于调用存储API $storageToken = $authResult.AccessToken # Graph令牌用于Graph API调用 $graphToken = $authResult.AccessToken # 或针对Graph单独获取令牌(若需要更精确的范围) $graphAuthResult = Get-MsalToken -ClientId $clientId -Scopes "DeviceManagementApps.Read.All" -Silent $graphToken = $graphAuthResult.AccessToken
注意事项
- 确保你的用户账户本身拥有Intune管理员相关的角色权限(如Intune管理员、全局管理员等),否则即使令牌包含权限范围,API也会返回权限不足。
- 使用
-Scopes参数时,权限范围需准确对应MS Graph的权限名称。
内容的提问来源于stack exchange,提问作者elime
相关产品推荐
相关产品推荐

