启用后端应用注册用户分配后Azure User Impersonation失效求助
Azure应用注册启用用户/组分配后User_impersonation失效问题解决
问题背景
我拥有两个Azure应用注册:一个用于后端,一个用于前端,配置如下:
- 后端应用注册:已暴露名为
User_impersonation的权限范围 - 前端应用注册:已添加上述
User_impersonation权限,且启用了用户/组分配功能,指定一个安全组,仅允许该组成员访问前端
此前用户通过前端应用注册获取的访问令牌请求前端时,前端可正常向后端请求令牌并转发用户请求。但在后端应用注册也启用用户/组分配(添加同一安全组)后,前端无法调用后端,User_impersonation功能失效,请求超时无响应。
相关代码如下:
客户端请求前端代码
from azure.identity import DefaultAzureCredential, ClientSecretCredential authority="https://login.microsoftonline.com/{TENANT_ID}/v2.0" credential = DefaultAzureCredential(authority=authority, exclude_shared_token_cache_credential=True) scope = "api://{frontend_clientid}/.default" minerva_webapp_access_token = credential.get_token(scope).token
前端请求后端代码
credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=WEBAPP_CLIENT_ID, client_secret=webapp_client_secret) scope = "api://{minerva_python39_backend_app_client_id}/.default".format( minerva_python39_backend_app_client_id=MINERVA_PYTHON39_CLIENTID) access_token = credential.get_token(scope).token
解决方案
核心原因
后端启用用户/组分配后,前端使用ClientSecretCredential的客户端凭据流获取后端令牌时,未携带用户上下文,导致后端的分配验证无法识别用户所属安全组,进而拦截请求。
1. 切换为On-Behalf-Of(OBO)流程获取后端令牌
前端需基于收到的用户令牌,通过OBO流程申请带有用户上下文的后端访问令牌,这样后端才能验证用户是否属于允许的安全组。修改前端请求后端的代码:
from azure.identity import OnBehalfOfCredential # 前端接收的用户令牌(即客户端请求时传入的minerva_webapp_access_token) user_access_token = "<客户端传入的用户访问令牌>" # 初始化OBO凭据 obo_credential = OnBehalfOfCredential( tenant_id=TENANT_ID, client_id=WEBAPP_CLIENT_ID, client_secret=webapp_client_secret, user_assertion=user_access_token ) # 指定User_impersonation权限的scope,不要使用.default backend_scope = f"api://{MINERVA_PYTHON39_CLIENTID}/User_impersonation" backend_access_token = obo_credential.get_token(backend_scope).token
2. 确认后端应用注册配置
- 确保后端
User_impersonation权限的“同意权限”设置为允许管理员或用户同意(已配置的话可忽略) - 确认后端应用注册的用户/组分配中,目标安全组已正确添加,且组内包含所有需要访问后端的用户
3. 验证后端令牌有效性
使用JWT解析工具检查后端令牌:
groups声明需包含目标安全组的IDscp声明需包含User_impersonationoid声明对应用户的Object ID
4. 后端验证逻辑检查
确保后端在验证令牌时执行以下步骤:
- 验证令牌的签名、过期时间等基本有效性
- 检查
scp声明是否包含User_impersonation权限 - 验证用户所属
groups是否在允许的安全组列表中(或调用Microsoft Graph API查询用户组信息)
内容的提问来源于stack exchange,提问作者Aniss Chohra
相关产品推荐
相关产品推荐

