如何在基于Microsoft Identity Platform的ASP.NET Core应用中检查刷新令牌
检查ASP.NET Core应用是否获取到Microsoft Identity Platform的刷新令牌
1. 先确认配置是否满足获取刷新令牌的前提
要拿到刷新令牌,必须在请求的权限范围(scopes)中包含offline_access。你当前代码里的scopes变量需要确保包含这个值,否则Microsoft Identity Platform不会返回刷新令牌。
2. 通过OnTokenResponseReceived事件直接查看令牌响应
在你已注册的OnTokenResponseReceived事件中,可以直接读取身份平台返回的完整令牌响应,其中就包含刷新令牌(如果存在的话)。修改代码如下:
options.Events.OnTokenResponseReceived = async e => { // 直接查看响应中的refresh_token字段 var refreshToken = e.TokenResponse.RefreshToken; // 调试时可以在这里打断点,或者输出到控制台 Console.WriteLine($"刷新令牌内容: {refreshToken ?? "未获取到刷新令牌"}"); // 也可以读取完整的响应体内容 var responseContent = await new StreamReader(e.HttpResponse.ResponseStream).ReadToEndAsync(); Console.WriteLine("完整令牌响应: " + responseContent); await Task.CompletedTask; };
启动应用完成登录流程后,查看控制台输出或在调试器中检查refreshToken变量:如果不为空,说明已获取到刷新令牌;如果为空,说明身份平台未返回。
3. 检查分布式令牌缓存中的内容
因为你启用了AddDistributedTokenCaches(),用户的令牌(包括刷新令牌)会被存储到分布式缓存中。可以在控制器或服务中注入IDistributedCache,根据缓存键查询令牌数据:
public class TokenCheckController : Controller { private readonly IDistributedCache _distributedCache; public TokenCheckController(IDistributedCache distributedCache) { _distributedCache = distributedCache; } public async Task<IActionResult> VerifyRefreshToken() { // 缓存键格式通常为: "Microsoft.Identity.Web.Tokens.{用户对象ID}.{租户ID}" var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); var tenantId = User.FindFirstValue("http://schemas.microsoft.com/identity/claims/tenantid"); var cacheKey = $"Microsoft.Identity.Web.Tokens.{userId}.{tenantId}"; var tokenCacheData = await _distributedCache.GetStringAsync(cacheKey); if (!string.IsNullOrEmpty(tokenCacheData)) { // 反序列化后查看是否包含refresh_token字段 var tokenEntry = System.Text.Json.JsonSerializer.Deserialize<dynamic>(tokenCacheData); var refreshToken = tokenEntry?.RefreshToken; // 调试时查看refreshToken的值 } return Ok(); } }
4. 用浏览器开发者工具抓包验证
在登录流程中,打开浏览器开发者工具的Network面板,抓取身份平台的token端点请求(地址通常是https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token),查看响应体中的refresh_token字段是否存在。
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

