You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure App Service对接AAD身份提供程序的Python Streamlit应用获取登录用户信息

可行解决思路

1. 先确认Azure App Service身份验证的令牌配置

  • 进入Azure门户对应App Service的「身份验证」面板,找到你配置的AAD身份提供程序点击编辑
  • 确认令牌存储选项已经开启,这个是/.auth/me端点能返回数据的前提,未开启时该接口只会返回空数组
  • 检查添加的权限范围,必须至少包含openid、email、profile三个委托权限,否则AAD不会返回用户姓名、邮箱这类声明

2. 修正/.auth/me端点的调用方式

Streamlit部署在App Service上时,调用该接口不能用外部域名请求,要在服务端发起本地请求,避免跨域和身份凭证传递问题:

  • 服务端请求时必须带上当前请求的X-MS-TOKEN-AAD-ID-TOKEN请求头,这个头是App Service认证通过后自动注入到发往后端的请求中的
  • 参考实现代码:
import streamlit as st
import requests

def get_user_info():
    # 从请求头获取App Service注入的ID令牌,Streamlit 1.23+版本支持st.context.headers
    id_token = st.context.headers.get("X-MS-TOKEN-AAD-ID-TOKEN")
    if not id_token:
        return None
    # 本地调用/.auth/me端点,避免跨域
    headers = {"X-MS-TOKEN-AAD-ID-TOKEN": id_token}
    response = requests.get("http://localhost/.auth/me", headers=headers)
    if response.status_code == 200:
        return response.json()
    return None

user_info = get_user_info()
if user_info:
    st.write(user_info)

如果你的Streamlit版本低于1.23,需要先升级版本才能获取请求头。

3. 直接从请求头获取声明(更简化方案)

App Service认证通过后会自动把用户的核心声明注入到请求头里,不需要调用/.auth/me也能拿到基础信息:

  • 姓名可以从X-MS-CLIENT-PRINCIPAL-NAME头获取
  • 邮箱可以从X-MS-CLIENT-PRINCIPAL-EMAIL头获取
  • 用户ID可以从X-MS-CLIENT-PRINCIPAL-ID头获取
  • 如果需要更多自定义声明,可以直接解析X-MS-TOKEN-AAD-ID-TOKEN头里的JWT令牌内容

4. 排查Streamlit配置问题

  • 确认你没有在Streamlit配置里开启CORS限制或者反向代理配置错误,导致App Service注入的请求头被丢弃
  • 不要在客户端用JavaScript调用/.auth/me,跨域限制会导致请求携带的身份凭证失效,所有用户信息获取逻辑必须放在服务端执行

内容的提问来源于stack exchange,提问作者Grumpybeard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:24:05