使用Microsoft Graph模块获取委托权限AccessToken遇401未授权问题
解决自定义API调用401未授权问题
问题原因
你用Connect-MgGraph完成的认证,默认拿到的是Microsoft Graph服务专用的访问令牌,这个令牌只能调用Graph API,没法用于你的自定义API(api://$serviceId),所以才会返回401未授权。
必要前置配置
先确认两个应用注册的配置没问题:
- 客户端应用(
$appId)已经添加了自定义API($serviceId)的委托权限MyData.FullControl.All,如果是租户级权限,必须完成管理员同意。 - 自定义API的应用注册里,已经在「公开API」页面正确暴露了
MyData.FullControl.All这个范围。
修正后的PowerShell代码
用Get-MgAccessToken专门获取自定义API的访问令牌,再用标准HTTP请求cmdlet调用你的服务:
$tenantId = '00000000-0000-0000-0000-000000000000' $appId = '00000000-0000-0000-0000-000000000000' $serviceId = '00000000-0000-0000-0000-000000000000' # 定义自定义API的权限范围 $customApiScopes = "api://$serviceId/MyData.FullControl.All offline_access" # 安装并导入Microsoft Graph模块 Install-Module Microsoft.Graph -Scope CurrentUser -Repository PSGallery -Force Import-Module Microsoft.Graph.Authentication # 设备码流认证,指定自定义API的范围 Connect-MgGraph -ClientId $appId -TenantId $tenantId -Scopes $customApiScopes -UseDeviceCode -NoWelcome # 获取针对自定义API的访问令牌 $accessToken = Get-MgAccessToken -Scope $customApiScopes # 调用自定义API $headers = @{ 'Accept' = 'application/json' 'Authorization' = "Bearer $($accessToken.Token)" } Invoke-RestMethod -Method GET ` -Uri 'https://my-service-endpoint.azurewebsites.net/api/data/01' ` -Headers $headers ` -ContentType 'application/json'
几个关键点
- 别用
Invoke-MgGraphRequest调用自定义API:这个cmdlet是专门为Microsoft Graph API设计的,会自动附加Graph相关请求头,不适合第三方服务。 Get-MgAccessToken的作用:它可以根据指定范围,获取对应资源的访问令牌,完美解决默认Graph令牌不兼容自定义API的问题。- 离线访问支持:如果你需要长期使用令牌,
offline_access范围会返回刷新令牌,后续可以用它获取新的访问令牌,无需重新认证。
内容的提问来源于stack exchange,提问作者Daniel M.
相关产品推荐
相关产品推荐

