.NET Web应用中AddMicrosoftIdentityWebAppAuthentication刷新令牌未自动触发问题
问题描述
我的.NET Web应用中配置了以下认证代码:
services.AddMicrosoftIdentityWebAppAuthentication(Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph() .AddInMemoryTokenCaches();
并在appsettings.json中配置了AzureAD相关信息:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "****************", "ClientId": "****************", "TenantId": "****************", "ClientSecret": "****************", "CallbackPath": "/signin-oidc", "SignedOutCallbackPath ": "/signout-callback-oidc", "Authority": "https://login.microsoftonline.com/****************, "ResponseType": "code", "UsePkce": true, "Scopes": "**************** , "TokenValidationParameters": { "NameClaimType": "name", "RoleClaimType": "roles" }, "TokenAcquisitionOptions": { "RefreshBuffer": 120, "ForceRefreshOnExpiration": true } },
我通过上述配置获取Access Token调用Microsoft Graph API,但一小时后令牌过期时,系统未自动使用Refresh Token获取新令牌。请问该刷新逻辑是否应自动触发?我是否遗漏了配置项?
解答
首先,令牌自动刷新逻辑是应该自动触发的,但你的配置和使用流程可能存在以下问题:
- 配置文件语法错误:检查你的
appsettings.json,Authority和Scopes字段末尾都缺少闭合双引号,这会导致配置解析失败,TokenAcquisition模块无法正确读取刷新相关配置。 - Token缓存存储限制:你使用的
AddInMemoryTokenCaches()是内存级缓存,在Web应用(尤其是多实例部署场景)中容易出现缓存丢失,若刷新令牌未被正确持久化存储,就无法触发刷新逻辑。建议改用分布式缓存(如Redis)或持久化缓存方案存储令牌。 - API调用方式不正确:必须通过
ITokenAcquisition服务的GetAccessTokenForUserAsync方法获取令牌,而非手动存储复用令牌。该方法内部会自动检测令牌有效期,结合你配置的RefreshBuffer在令牌过期前自动触发刷新。 - 缺少刷新令牌必要权限:确认Azure AD应用注册中已配置
offline_access权限,这是获取刷新令牌的前提。如果没有该权限,系统不会返回刷新令牌,自然无法完成自动刷新。
补充说明:TokenAcquisitionOptions中的ForceRefreshOnExpiration和RefreshBuffer配置是有效的,但需要满足配置解析正确、刷新令牌存在且被正确存储、API调用使用官方令牌获取方法这几个前提。
内容的提问来源于stack exchange,提问作者Donald518
相关产品推荐
相关产品推荐

