Вы можете обновить sh токен доступа несколькими способами. Ниже я проиллюстрирую, как можно использовать токен доступа с использованием промежуточного программного обеспечения в AS PNET Core.
В классе запуска в настройке Метод добавить следующую строку, которая будет обновлять токен доступа, когда он близок к истечению срока действия. Примечание: добавьте после "app.UseAuthentication ()".
app.UseMiddleware<CheckAccessTokenValidityMiddleware>();
Создайте метод расширения, который будет автоматически обновлять токен доступа по мере его истечения следующим образом
public class CheckAccessTokenValidityMiddleware
{
private readonly RequestDelegate _next;
private readonly IConfiguration _configuration;
public CheckAccessTokenValidityMiddleware(RequestDelegate next, IConfiguration configuration)
{
_next = next;
_configuration = configuration;
}
public async Task InvokeAsync(HttpContext context)
{
var expireAt = await context.GetTokenAsync("expires_at");
if (expireAt != null)
{
var dateExpireAt = DateTime.Parse(expireAt, null, DateTimeStyles.RoundtripKind);
if(dateExpireAt != null)
{
if ((dateExpireAt - DateTime.Now).TotalMinutes < 10)
{
var discoveryClient = new DiscoveryClient(_configuration["OIDC:Authority"]);
discoveryClient.Policy.RequireHttps = false;
var discovery = await discoveryClient.GetAsync();
if (!discovery.IsError)
{
using (var tokenClient = new TokenClient(discovery.TokenEndpoint, ClientConstants.KodelessClientId, ClientConstants.KodelessClientSecret))
{
var refreshToken = await context.GetTokenAsync("refresh_token");
var tokenResult = await tokenClient.RequestRefreshTokenAsync(refreshToken);
if (!tokenResult.IsError)
{
var newIdToken = tokenResult.IdentityToken;
var newAccessToken = tokenResult.AccessToken;
var newRefreshToken = tokenResult.RefreshToken;
var tokens = new List<AuthenticationToken>
{
new AuthenticationToken {Name = OpenIdConnectParameterNames.IdToken, Value = newIdToken},
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.AccessToken,
Value = newAccessToken
},
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.RefreshToken,
Value = newRefreshToken
}
};
var expiresAt = DateTime.Now + TimeSpan.FromSeconds(tokenResult.ExpiresIn);
tokens.Add(new AuthenticationToken
{
Name = "expires_at",
Value = expiresAt.ToString("o", CultureInfo.InvariantCulture)
});
var info = await context.AuthenticateAsync(AuthenticationConstants.Cookies);
info.Properties.StoreTokens(tokens);
await context.SignInAsync(AuthenticationConstants.Cookies, info.Principal, info.Properties);
}
else
{
await context.SignOutAsync(AuthenticationConstants.Cookies);
await context.SignOutAsync(AuthenticationConstants.Oidc);
}
}
}
}
}
}
await _next.Invoke(context);
}
}