ASP.NET Core 集成AAD时如何查看MSAL令牌缓存内容?
核心场景
- 基于ASP.NET Core MVC开发机密Web应用,通过Microsoft Identity Web对接Azure AD,需实现对下游WebAPI的认证调用
- Startup.cs中已完成如下服务注册配置:
services.AddMicrosoftIdentityWebAppAuthentication(Configuration) .EnableTokenAcquisitionToCallDownstreamApi(new string[] { Configuration["ConfigSection:ConfigSectionScopes"] }) .AddInMemoryTokenCaches();
- 现有可正常运行的逻辑:通过依赖注入获取的
ITokenAcquisition调用GetAccessTokenForUserAsync,传入指定作用域即可成功获取访问令牌,按设计令牌会自动写入内存令牌缓存
遇到的问题
- 实际需求:需要直接校验令牌缓存状态,确认当前登录用户的令牌是否存在、以及是否存储了同一用户下其他关联作用域的令牌
- 异常表现:调用
app.GetAccountsAsync()获取缓存内的账户列表时,返回结果始终为null
问题原因与处理方法
- 异常根因
- 若你调用的
app是全局获取的MSAL机密客户端应用实例,本身不绑定当前HTTP请求的登录用户上下文。内存令牌缓存的条目是与登录用户身份、租户ID、客户端ID强绑定的,脱离请求用户上下文直接全局查询,无法匹配到对应缓存条目,因此查询结果为null - 内存令牌缓存默认不对外暴露全局可枚举的账户列表,避免跨用户越权访问缓存内容
- 若你调用的
- 正确的校验方式
- 不要直接使用全局的应用级客户端实例查询缓存,必须在当前登录用户的请求作用域内从依赖注入容器获取与当前用户绑定的客户端实例
- 具体操作流程:
- 在需要校验缓存的Controller/页面Action中,从依赖注入容器获取请求作用域的
IClientApplicationBase实例(Microsoft Identity Web会自动根据当前登录用户的声明填充用户上下文,无需手动传入参数) - 调用该实例的
GetAccountsAsync()方法,即可查询到当前登录用户在缓存中存储的账户条目 - 若需要遍历查看当前用户关联的所有令牌缓存条目,可注入
IMsalTokenCacheProvider,通过其暴露的底层缓存接口,按当前用户的唯一标识符匹配所有关联的缓存记录
- 在需要校验缓存的Controller/页面Action中,从依赖注入容器获取请求作用域的
- 注意:在匿名访问、无登录用户的请求上下文中调用上述方法,没有绑定对应的用户缓存条目,返回null属于正常现象
内容的提问来源于stack exchange,提问作者cty
相关产品推荐
相关产品推荐

