Azure WebApp SSO认证后获取用户用户名或邮箱的问题咨询
Azure WebApp SSO 后获取用户信息实现方案
核心逻辑
该需求可直接通过Azure App Service内置身份验证(Easy Auth)的自动注入能力实现,无需自行实现OAuth2认证流程,你之前参考的是Databricks专属认证文档,和当前场景不匹配,因此出现401资源不存在错误。
最简实现:直接读取请求头获取用户邮箱
Azure App Service在用户完成SSO登录后,会自动将身份信息注入转发到应用的HTTP请求头,直接读取对应字段即可:
- 对应用户登录邮箱的请求头为
X-MS-CLIENT-PRINCIPAL-NAME - 对应用户租户内唯一ID的请求头为
X-MS-CLIENT-PRINCIPAL-ID,适合作为权限绑定的唯一标识
Streamlit 读取请求头的代码示例:
import streamlit as st from streamlit.web.server.websocket_headers import _get_websocket_headers # 读取所有请求头 headers = _get_websocket_headers() # 提取身份信息 user_email = headers.get("X-MS-CLIENT-PRINCIPAL-NAME") user_id = headers.get("X-MS-CLIENT-PRINCIPAL-ID") # 未获取到身份信息直接拦截 if not user_email: st.error("未获取到有效身份信息,请确认已完成组织SSO登录") st.stop() # 基于邮箱实现权限控制 st.write(f"当前登录用户:{user_email}") # 权限判断示例 admin_list = ["admin@your-tenant.com", "ops@your-tenant.com"] if user_email in admin_list: st.info("您拥有管理员权限,可查看全量数据") # 管理员功能逻辑 else: st.info("您拥有普通用户权限,仅可查看公开数据") # 普通用户功能逻辑
扩展实现:调用Graph API获取更多用户属性
如果需要获取部门、职位等请求头未包含的用户属性,可按以下操作实现:
- 进入Azure Portal对应Web应用的「身份验证」面板,编辑已配置的Microsoft身份提供方
- 在「令牌配置」栏添加Microsoft Graph的
User.Read委托权限,勾选「授予租户管理员同意」 - 保存配置后,即可从请求头
X-MS-TOKEN-AAD-ACCESS-TOKEN获取Graph API访问令牌,调用接口获取完整用户信息
代码示例:
import requests import streamlit as st from streamlit.web.server.websocket_headers import _get_websocket_headers headers = _get_websocket_headers() access_token = headers.get("X-MS-TOKEN-AAD-ACCESS-TOKEN") if access_token: resp = requests.get( "https://graph.microsoft.com/v1.0/me", headers={"Authorization": f"Bearer {access_token}"} ) full_user_info = resp.json() # 可获取displayName、mail、department、jobTitle等所有Azure AD同步的用户属性 st.write("完整用户信息:", full_user_info)
原401错误说明
你之前的报错是因为请求的资源ID为Databricks的应用ID,和你当前的Web应用场景不匹配,按照上述方案无需自行发起OAuth2认证请求,直接使用内置注入的请求头即可解决问题。
内容的提问来源于stack exchange,提问作者clank
相关产品推荐
相关产品推荐

