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; 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; var n = DateTime.UtcNow; if (diff.TotalMinutes <= 2) return await _authenticationClientService.Value.RefreshTokenAsync(); return string.Empty; } } }