Azure Web App Easy Auth会话超时问题咨询:/.auth/me返回空数组
解决Azure Web App Easy Auth会话超时后Angular无法获取令牌的问题
问题原因分析
Easy Auth的会话(由Web App生成的认证Cookie)超时后,/.auth/me接口会返回空数组;而Angular作为单页应用,前端路由跳转不会触发服务器端的Auth检查,因此Web App不会自动重定向到登录页,导致客户端无法重新获取令牌。
具体解决方案
1. 客户端主动检查会话状态并触发登录
在Angular中通过HTTP拦截器统一处理所有API请求,先验证/.auth/me的返回结果:
- 若返回空数组,直接跳转到Web App的登录端点(如
/.auth/login/aad,需根据你的身份提供者调整),触发Easy Auth的重定向登录流程。 - 登录完成后,Web App会自动跳回原应用页面,此时
/.auth/me即可重新获取有效令牌。
示例拦截器代码:
import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, switchMap } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable() export class AuthInterceptor implements HttpInterceptor { constructor(private http: HttpClient) {} intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> { return this.http.get('/.auth/me').pipe( switchMap((authData: any[]) => { if (authData.length === 0) { // 会话过期,跳转至Easy Auth登录页 window.location.href = '/.auth/login/aad'; throw new Error('Authentication session expired'); } // 提取令牌并添加到请求头 const accessToken = authData[0].access_token; const authenticatedReq = request.clone({ setHeaders: { Authorization: `Bearer ${accessToken}` } }); return next.handle(authenticatedReq); }) ); } }
2. 调整Azure Web App的会话超时配置
在Azure Portal的Web App「Authentication」设置中,找到「Session management」:
- 延长Token store的过期时间,默认1小时,可根据业务需求调整为8小时等更长时长。
- 开启Persistent session,让认证Cookie持久化到浏览器,用户关闭浏览器后重新打开仍能保持登录状态,减少闲置超时触发频率。
3. 让API请求触发服务器端Auth检查
若Angular调用的REST API通过Web App反向代理转发,可配置反向代理规则,确保API路径经过Easy Auth认证检查:
- 对于IIS托管的Web App,修改
web.config中的重写规则,添加对API路径的Auth验证要求。 - 对于Linux/容器化Web App,使用
routes.json配置路由规则,指定API路径需要认证。
这样会话过期时,Web App会直接对API请求返回401状态码,Angular捕获后再触发登录跳转。
注意事项
- 确保Web App的「Allowed external redirect URLs」包含Angular应用的基础路径,避免登录后跳转失败。
- 根据实际使用的身份提供者调整登录端点路径(如Azure AD为
/.auth/login/aad,Google为/.auth/login/google)。 - 若需静默刷新令牌,可使用Easy Auth的
/.auth/refresh接口,但需确保refresh_token处于有效期内。
内容的提问来源于stack exchange,提问作者Water
相关产品推荐
相关产品推荐

