You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor 8应用用Microsoft.Identity.Web集成Azure AD OIDC无刷新令牌问题

无法获取Azure AD刷新令牌的可能原因

针对你在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:20:53