Blazor 8应用用Microsoft.Identity.Web集成Azure AD OIDC无刷新令牌问题
针对你在Blazor 8 Web应用中使用Microsoft.Identity.Web实现Azure AD认证时无法获取刷新令牌的问题,以下是常见的排查方向:
未配置
SaveTokens = true
默认情况下,OpenIdConnect中间件不会将刷新令牌保存到认证票据中。需要在配置AddMicrosoftIdentityWebApp时显式开启保存令牌的选项,否则后续通过context.GetTokenAsync("refresh_token")无法获取到值。示例配置:builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"), options => { options.SaveTokens = true; // 必须开启此配置 });令牌缓存服务未正确配置
Microsoft.Identity.Web依赖令牌缓存来存储刷新令牌,若未添加缓存实现(如内存缓存、分布式缓存),刷新令牌无法被持久化。需确保配置中包含令牌缓存服务,例如:.AddMicrosoftIdentityWebApp(...) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches(); // 添加内存令牌缓存offline_access权限未被正确授予
虽然你已配置该权限范围,但需确认:- 权限类型为委托权限(
offline_access仅支持委托权限); - 已获得用户或管理员的同意。若用户首次登录时未同意该权限,Azure AD不会颁发刷新令牌。可通过在登录请求中添加
prompt=consent参数强制用户重新授权。
- 权限类型为委托权限(
认证事件的获取时机错误
在OnTokenValidated事件中尝试获取刷新令牌可能时机过早,此时令牌尚未被保存到票据中。建议在AuthorizationCodeReceived事件中处理授权码交换逻辑,此时可直接从令牌响应中获取刷新令牌:options.Events.AuthorizationCodeReceived = async context => { var refreshToken = context.TokenEndpointResponse.RefreshToken; // 处理刷新令牌 };应用注册配置限制
检查Azure AD应用注册的认证设置:- 对于Blazor Web App(服务器端托管),需确保应用类型为Web而非单页应用(SPA);
- 确认未在应用注册中禁用刷新令牌的颁发(默认允许,但若有特殊配置需检查)。
托管模型适配问题
若使用Blazor Interactive Server模式,需确保认证中间件的顺序正确:先调用app.UseAuthentication(),再调用app.UseAuthorization(),否则认证票据无法被正确加载,导致无法读取刷新令牌。
内容的提问来源于stack exchange,提问作者Tenacious

