如何从Azure托管的App Service中获取已登录用户名称
根因说明
这是Azure App Service内置身份验证(俗称Easy Auth)和ASP.NET原生身份管线未打通的典型问题:
- 你在Azure门户配置的强制登录是App Service网关层面的拦截,请求在到达应用代码前就已经完成了登录校验,但网关默认不会自动把身份信息填充到ASP.NET的
HttpContext.Current.User对象中,只会把IsAuthenticated标记为true,对应的Name字段没有赋值,才会出现你看到的只有前缀没有用户名的情况。 - Easy Auth完成校验后,会通过专属请求头、本地身份端点两种方式把用户信息透传给应用,需要你主动读取或者配置应用适配。
可落地的解决方案
二选一即可,优先选改动最小的方案1。
方案1:直接读取Easy Auth透传的请求头(零配置改动,仅需调整少量代码)
Easy Auth校验通过后,会在转发到应用的请求中携带X-MS-CLIENT-PRINCIPAL-NAME请求头,值就是当前登录用户的UPN(也就是你要的组织内用户名),直接读取即可,同时保留原有逻辑兼容本地运行场景:
protected void Page_Load(object sender, EventArgs e) { // 读取Azure Easy Auth注入的用户名头 var loginUserName = Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"]; if (!string.IsNullOrWhiteSpace(loginUserName)) { lblUserInfo.Text = $"Found User -- > {loginUserName}"; return; } // 原有本地/其他认证场景逻辑 if (HttpContext.Current.User.Identity.IsAuthenticated) { var identity = HttpContext.Current.User.Identity.Name; lblUserInfo.Text = $"Found User -- > {identity}"; return; } lblUserInfo.Text = "Name Unknown!"; }
如果需要获取更多用户属性(比如邮箱、工号、部门信息),可以对X-MS-CLIENT-PRINCIPAL请求头做Base64解码,里面是序列化后的完整用户声明列表。
方案2:配置应用适配Easy Auth,让原生HttpContext.Current.User正常赋值
如果你不想修改读取用户信息的代码,想让原有逻辑直接生效,按以下步骤配置:
- 修改项目根目录的
web.config,把应用默认的认证模式改为None,避免表单认证模块和Easy Auth冲突:
<system.web> <authentication mode="None" /> </system.web>
- 回到Azure App Service的身份验证边栏,确认「令牌存储」开关处于开启状态,否则网关不会向应用透传身份相关的请求头。
- 如果是基于OWIN管线的Web Forms应用,安装
Microsoft.Owin.Security.ActiveDirectory包,在启动类中配置JWT令牌验证参数,对接App Service透传的身份令牌,即可自动填充HttpContext.Current.User的所有字段。
常见排查点
如果配置后还是拿不到用户名,逐一检查:
- 确认AAD身份提供程序的回调地址配置正确,没有给首页路径配置匿名访问例外规则
- 如果是ASP.NET Core应用,需要在请求管线中先调用
app.UseAuthentication(),且顺序要放在授权、路由中间件之前 - 不要在应用代码中自行实现登录/登出跳转逻辑,这部分已经由Easy Auth完全接管,自定义认证逻辑会覆盖透传的身份信息
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

