启用2FA的微软Azure账户如何无交互调用GenerateToken REST API
问题描述
我当前的流程是:
- 步骤1:通过REST API后端服务登录启用2FA的微软账户,获取访问令牌,调用的API为:
POST https://login.microsoftonline.com/common/oauth2/token - 步骤2:使用该访问令牌调用PowerBI账户API获取嵌入令牌
但当微软账户启用2FA时,调用上述API会报错,无法完成流程(禁用2FA时可正常运行),报错信息如下:
"error": "interaction_required", "error_description": "AADSTS50076: Due to a configuration change made by your administrator, or because you moved to a new location, you must use multi-factor authentication to access '00000009-0000-0000-c000-000000000000'. Trace ID: 05451564-7c99-454f-9f1c-85b5d0ac6a00 Correlation ID: 026670ad-9c04-46d8-828b-0c1435938e90 Timestamp: 2023-11-05 14:11:35Z", "error_codes": [ 50076 ]
要求流程必须完全通过REST API实现,不能提示用户输入验证码,请问如何在启用2FA的情况下完成这个流程?
解决方案
你当前使用的用户名密码流(Resource Owner Password Credentials flow)无法支持无交互的MFA验证,Azure AD会直接拦截这类请求。推荐以下两种可行方案:
1. 服务主体(Service Principal)认证(推荐)
这是后端服务无交互访问PowerBI的最佳实践:
- 在Azure AD中注册一个应用程序(即服务主体),根据业务需求给它分配PowerBI相关权限(比如
Report.Read.All、Workspace.Read.All等) - 使用服务主体的客户端ID、客户端密钥(或证书)调用令牌接口获取访问令牌,请求地址:
请求参数:POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/tokengrant_type=client_credentials client_id={你的服务主体ID} client_secret={你的服务主体密钥} scope=https://analysis.windows.net/powerbi/api/.default - 拿到令牌后直接调用PowerBI API获取嵌入令牌,该方式无需依赖用户账户的2FA状态,完全基于服务主体的权限访问。
2. 设备码流(Device Code Flow)(需用户一次性授权)
如果必须使用特定用户账户访问,可通过设备码流完成一次MFA授权后,后续无交互获取令牌:
- 调用设备码接口获取授权信息:
请求参数:POST https://login.microsoftonline.com/common/oauth2/v2.0/devicecodeclient_id={你的应用ID} scope=https://analysis.windows.net/powerbi/api/Report.Read.All offline_access - 拿到
device_code、user_code和verification_uri后,让用户在浏览器打开verification_uri输入user_code并完成MFA验证(仅需一次) - 后端轮询令牌接口获取刷新令牌和访问令牌:
请求参数:POST https://login.microsoftonline.com/common/oauth2/v2.0/tokengrant_type=device_code client_id={你的应用ID} device_code={拿到的device_code} - 后续可使用刷新令牌无交互获取新的访问令牌,无需再次验证MFA。
注意事项
- 资源所有者密码流已被微软标记为不推荐用于生产环境,且在启用MFA的场景下会被强制拦截,建议尽快替换为上述方案。
内容的提问来源于stack exchange,提问作者arman
相关产品推荐
相关产品推荐

