Angular集成Azure AD B2C:AcquireTokenSilent未过期仍返回新AccessToken
以下是针对你遇到的「未过期但每次返回新令牌」问题的排查和解决步骤:
检查Scope匹配性
确保登录流程中请求的Scope包含https://*********.com/api/FullAccess。如果登录时未申请该Scope,缓存中不会存在对应令牌,每次调用acquireTokenSilent都会触发新的令牌获取。调整缓存查找策略
将cacheLookupPolicy从CacheLookupPolicy.Default改为CacheLookupPolicy.CacheOnly,强制优先从本地缓存读取有效令牌,只有缓存无有效令牌时才会失败(此时可再处理刷新逻辑)。修改后的请求参数:const accessTokenRequest = { scopes: ["https://*********.com/api/FullAccess"], account: account || this.authService.instance.getAllAccounts()[0], forceRefresh: false, cacheLookupPolicy: CacheLookupPolicy.CacheOnly, refreshTokenExpirationOffsetSeconds: 7200 };移除不必要的刷新偏移参数
你设置的refreshTokenExpirationOffsetSeconds:7200会让MSAL在刷新令牌过期前2小时就主动获取新令牌。如果你的访问令牌有效期较短,可能会被这个参数触发提前刷新。尝试移除该参数,使用默认值后再观察结果。确认账户匹配正确性
检查getAccountByUsername('abc@gmail.com')返回的账户是否与缓存中的账户完全匹配(比如用户名大小写、租户ID是否一致)。如果账户不匹配,MSAL会认为没有对应缓存令牌,从而重新获取。可以打印account和getAllAccounts()的结果进行比对。手动验证缓存内容
在调用acquireTokenSilent前,通过authService.instance.getTokenCache().getAccessTokenCache()查看缓存中的令牌信息,确认是否存在符合Scope和账户要求的未过期令牌。如果存在但方法仍返回新令牌,重点排查参数配置问题。
内容的提问来源于stack exchange,提问作者Mushfique Hossain

