using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.DependencyInjection; // 需要这个命名空间来获取 IServiceProvider using System; // 需要这个命名空间来使用 Lazy namespace TechHelper.Client.HttpRepository { public class RefreshTokenService : IRefreshTokenService { private readonly Lazy _authenticationStateProvider; private readonly Lazy _authenticationClientService; public RefreshTokenService(IServiceProvider serviceProvider) { _authenticationStateProvider = new Lazy( () => serviceProvider.GetRequiredService()); _authenticationClientService = new Lazy( () => serviceProvider.GetRequiredService()); } public async Task TryRefreshToken() { var authState = await _authenticationStateProvider.Value.GetAuthenticationStateAsync(); var user = authState.User; // 如果 user 或 claims 为空,表示用户未认证,直接返回空字符串 if (user?.Identity == null || !user.Identity.IsAuthenticated) { return string.Empty; } var expClaim = user.FindFirst(c => c.Type.Equals("exp"))?.Value; // 使用 ?. 防止空引用 if (string.IsNullOrEmpty(expClaim)) { return string.Empty; // 没有过期时间声明,也直接返回 } var expTime = DateTimeOffset.FromUnixTimeSeconds( Convert.ToInt64(expClaim)); var diff = expTime - DateTime.UtcNow; // 只有当令牌即将过期时才尝试刷新 if (diff.TotalMinutes <= 2) return await _authenticationClientService.Value.RefreshTokenAsync(); // 访问 .Value 来调用方法 return string.Empty; } } }