Принудительный вход в систему, когда токен обновления больше не работает

avatar
Dismissile
1 июля 2021 в 15:46
182
1
1

У меня есть приложение ASP.net core 3.1 MVC, использующее OpenID Connect с Identity Server 4. Я использую IdentityModel для автоматического обновления токенов доступа в своем приложении. Конфигурация выглядит следующим образом:

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{    
    options.SlidingExpiration = false;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
})
.AddOpenIdConnect("oidc", options =>
{
    options.Authority = "https://localhost:5001";

    options.ClientId = "mvc";
    options.ClientSecret = "secret";
    options.ResponseType = "code";

    options.SaveTokens = true;

    options.Scope.Add("profile");
    options.Scope.Add("api1");
    options.Scope.Add("offline_access");
    options.GetClaimsFromUserInfoEndpoint = true;
    options.SignedOutCallbackPath = "/oidc-signout";
    options.SignedOutRedirectUri = "/goodbye";
});

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

services.AddHttpClient("api1", configure =>
{
    configure.BaseAddress = new Uri("https://localhost:6001");
});

services.AddAccessTokenManagement();

У меня есть контроллер, который будет извлекать данные из нижестоящего API, защищенного с помощью этого сервера идентификации. Мой клиент MVC запрашивает область действия api1 и offline_access для получения токенов обновления. Эти токены хранятся в файле cookie, так как для служб установлено SaveTokens = true.

Все работает нормально. Когда я вхожу в систему, я получаю токен доступа и токен обновления. У меня есть токен доступа, который длится около 20 минут, и когда он истекает, он вызывает конечную точку токена с токеном обновления, чтобы получить новый токен доступа + токен обновления.

Есть один сценарий, который я не знаю, как поступить, когда время жизни моего токена обновления истекло. Если я установлю время жизни токена обновления на 8 часов, но мой сеанс MVC все еще активен, он попытается получить новый токен обновления и потерпит неудачу.

Есть ли какое-то событие в промежуточном программном обеспечении OpenID connect, которое я могу обработать, которое обнаружит, когда ему не удастся получить этот токен обновления, и могу ли я использовать его, чтобы каким-то образом принудительно войти в систему (или, по крайней мере, туда и обратно на сервер идентификации/конечную точку авторизации? ) снова?

Источник

Ответы (1)

avatar
Tupac
2 июля 2021 в 06:34
0

Решение, которое я нашел, состоит в том, чтобы подключить это к промежуточному программному обеспечению Cookies. Вот общий поток:

При каждом запросе используйте события промежуточного ПО Cookies для проверки токена доступа.

Если срок его действия подходит к концу, запросите новый.

Замените новые токены доступа и обновления в ClaimsIdentity.

Указать промежуточному программному обеспечению Cookies обновить файл cookie сеанса, чтобы он содержал новые токены.

Вы можете обратиться к этому сообщению, оно может быть вам полезно:Какова цель срока действия токена ID в OpenID Connect?