Похоже, что значение oldIdToken отличается от tokenResult.IdentityToken, так что, вероятно, лучше использовать новое значение, которое отправляется вместе с новыми tokenResult.AccessToken и tokenResult.RefreshToken.

аюсь использовать токен обновления по истечении срока действия токена доступа. Похоже так на вопрос дан ответВот, А такжепример кода для обновления токена действием

И я получаю следующий код в файле startup.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "Cookies",
    //ExpireTimeSpan = TimeSpan.FromSeconds(100),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    Events = new CookieAuthenticationEvents()
    {
        OnValidatePrincipal = async x =>
        {
            if (x.Properties?.Items[".Token.expires_at"] == null) return;

            var logger = loggerFactory.CreateLogger(this.GetType());

            var now = DateTimeOffset.UtcNow;
            var tokenExpireTime = DateTime.Parse(x.Properties.Items[".Token.expires_at"]).ToUniversalTime();
            var timeElapsed = now.Subtract(x.Properties.IssuedUtc.Value);
            var timeRemaining = tokenExpireTime.Subtract(now.DateTime);

            if (timeElapsed > timeRemaining)
            {
                var httpContextAuthentication = x.HttpContext.Authentication;//Donot use the HttpContext.Authentication to retrieve anything, this cause recursive call to this event
                var oldAccessToken = await httpContextAuthentication.GetTokenAsync("access_token");
                var oldRefreshToken = await httpContextAuthentication.GetTokenAsync("refresh_token");
                logger.LogInformation($"Refresh token :{oldRefreshToken}, old access token:{oldAccessToken}");


                var disco = await DiscoveryClient.GetAsync(AuthorityServer);
                if (disco.IsError) throw new Exception(disco.Error);

                var tokenClient = new TokenClient(disco.TokenEndpoint, ApplicationId, "secret");
                var tokenResult = await tokenClient.RequestRefreshTokenAsync(oldRefreshToken);
                logger.LogInformation("Refresh token requested. " + tokenResult.ErrorDescription);


                if (!tokenResult.IsError)
                {

                    var oldIdToken = await httpContextAuthentication.GetTokenAsync("id_token");
                    var newAccessToken = tokenResult.AccessToken;
                    var newRefreshToken = tokenResult.RefreshToken;

                    var tokens = new List<AuthenticationToken>
                    {
                        new AuthenticationToken {Name = OpenIdConnectParameterNames.IdToken, Value = oldIdToken},
                        new AuthenticationToken {Name = OpenIdConnectParameterNames.AccessToken, Value = newAccessToken},
                        new AuthenticationToken {Name = OpenIdConnectParameterNames.RefreshToken, Value = newRefreshToken}
                    };

                    var expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResult.ExpiresIn);
                    tokens.Add(new AuthenticationToken { Name = "expires_at", Value = expiresAt.ToString("o", CultureInfo.InvariantCulture) });

                    var info = await httpContextAuthentication.GetAuthenticateInfoAsync("Cookies");
                    info.Properties.StoreTokens(tokens);
                    await httpContextAuthentication.SignInAsync("Cookies", info.Principal, info.Properties);

                }
                x.ShouldRenew = true;
            }
            else
            {
                logger.LogInformation("Not expired");
            }
        }

    }
});

Настройка клиента выглядит следующим образом

AllowAccessTokensViaBrowser = true,
RefreshTokenUsage = TokenUsage.ReUse,
RefreshTokenExpiration = TokenExpiration.Sliding,
AbsoluteRefreshTokenLifetime = 86400,    
AccessTokenLifetime = 10,
AllowOfflineAccess = true,
AccessTokenType, = AccessTokenType.Reference

После успешного входа в систему я получаю 401 за каждый второй запрос. И журнал говорит

[Identity Server] 2017-07-04 10: 15: 58.819 +01: 00 [Отладка] "TjpIkvHQi ../ cfivu6Nql5ADJJlZRuoJV1QI =" найдено в базе данных: True

[Identity Server] 2017-07-04 10: 15: 58.820 +01: 00 [Отладка] Предоставление "reference_token" со значением: "..9e64c1235c6675fcef617914911846fecd72f7b372" найдено в хранилище, но срок его действия истек.

[Identity Server] 2017-07-04 10: 15: 58.821 +01: 00 [Ошибка] Недопустимый ссылочный токен. "{\" ValidateLifetime \ ": правда,
\ "AccessTokenType \": \ "Reference \", \ "TokenHandle \": \ ".. 9e64c1235c6675fcef617914911846fecd72f7b372 \"} "

[Identity Server] 2017-07-04 10: 15: 58.822 +01: 00 [Отладка] Токен недействителен.

[Identity Server] 2017-07-04 10: 15: 58.822 +01: 00 [Отладка] Создание ответа самоанализа для неактивного токена.

[Identity Server] 2017-07-04 10: 15: 58.822 +01: 00 [Информация] Самоанализ маркера успеха. Статус токена: «неактивен», для имени API: «api1»

Любая помощь будет высоко ценится

ОБНОВИТЬ:

В основном, когда токен истекает, я получаюSystem.StackOverflowException на следующей строке

var tokenExpireTime = DateTime.Parse(x.Properties.Items[".Token.expires_at"]).ToUniversalTime();

ОБНОВЛЕНИЕ 2: Не используйте HttpContext.Authentication для получения чего-либо, Проверьте мой ответ ниже, чтобы найти рабочую реализацию

Ответы на вопрос(1)

Ваш ответ на вопрос