Azure Web App Easy Auth与Python azure.identity SDK适配问题咨询
适配Easy Auth与Azure SDK的解决方案
你可以通过OnBehalfOfCredential实现两者的兼容,无需放弃Easy Auth或Azure SDK。核心思路是利用Easy Auth注入到请求头中的用户令牌,通过OBO(代表用户)流程获取Azure资源API的访问令牌,供SDK使用。
具体步骤
- 提取请求头令牌:Easy Auth会在Web App的请求头中注入
X-MS-TOKEN-AAD-ACCESS-TOKEN(用户的访问令牌),直接从当前请求中提取该值。 - 初始化OnBehalfOfCredential:用你的应用注册信息(租户ID、客户端ID、客户端密钥/证书)加上提取到的用户令牌,创建凭证实例。Python示例代码如下:
from azure.identity import OnBehalfOfCredential from azure.mgmt.compute import ComputeManagementClient # 从请求头获取用户访问令牌 user_token = request.headers.get("X-MS-TOKEN-AAD-ACCESS-TOKEN") # 创建OBO凭证 credential = OnBehalfOfCredential( tenant_id="你的Azure租户ID", client_id="Web App对应的应用注册客户端ID", client_secret="应用注册的客户端密钥", user_assertion=user_token ) # 初始化SDK客户端(以虚拟机管理为例) compute_client = ComputeManagementClient(credential, "你的订阅ID") # 正常调用SDK方法,比如列出租户下所有VM for vm in compute_client.virtual_machines.list_all(): print(vm.name)
- 配置必要权限:
- 给应用注册添加对应的委托权限(比如
Microsoft.Compute/virtualMachines/read、Microsoft.Compute/virtualMachines/write等),并完成管理员同意。 - 在Web App的Easy Auth配置中,确保用户登录时请求了这些权限(配置认证设置里的“允许的令牌受众”和“权限范围”),保证拿到的用户令牌包含足够的scope。
- 给应用注册添加对应的委托权限(比如
为什么其他凭证不适用
DefaultAzureCredential:会尝试本地环境变量、CLI令牌等多种方式,和Web App上Easy Auth的代理认证场景不匹配,所以报错。SharedTokenCacheCredential:依赖本地缓存的用户令牌,不适用于Web App后端的无状态场景。AuthorizationCodeCredential:需要用户授权后的授权码,而Easy Auth已经完成了授权流程,没有授权码可供使用。
内容的提问来源于stack exchange,提问作者epopisces
相关产品推荐
相关产品推荐

