Истечение срока действия токена Identity Server 4 Api vs ClientApp - PullRequest
0 голосов
/ 22 апреля 2020

В настоящее время я создаю WebApp с аутентификацией / авторизацией для доступа к нему, а также для доступа к нескольким WebAPI, все из которых указывают на хост Identity Server 4. Я следил за официальной документацией IdentityServer4 и его демонстрациями и для аутентификаций клиентов, поколений токенов, входа пользователей, успешного вызова API с токенами, все работает нормально, но, однако, недавно я заметил, что после некоторого времени бездействия вызов API начинает получать 401, но клиентское приложение все еще работает с тем же маркером.

Это так:

  1. Запустить браузер с отладкой
  2. Войти с некоторыми пользователь
  3. Go для представления, которое вызывает один API для извлечения данных для него
  4. Продолжайте навигацию и тестирование, а все остальное работает нормально

Теперь проблема (после предыдущего шага 4)

  1. Прекратить отладку, но оставить браузер включенным и работающим (сохранять куки)
  2. Изменение кода, внедрение новых вещей (в основном, проходящих некоторое время)
  3. Запустите отладку снова
  4. Используя те же сеансы / cook ie в уже открытом браузере, пытаясь перейти на Приложение работает нормально и не требует нового входа в систему
  5. Переход к представлению, которое будет вызывать API с использованием текущего токена, дает мне 401, когда ранее не было

Что я узнал является то, что токен истек, выход Visual Studio указывает, что (также проверяя токен на https://jwt.io/ я могу подтвердить дату и время). Почему тот же самый токен отлично работает для ClientApp, а вызов API - нет? Требуется ли мне вручную генерировать новый токен из-за вызовов API?

Используемые мной конфигурации:

--- Приложение CLIENT ---

new Client
{
    ClientId = "idWebApp",
    ClientSecrets = new List<Secret> { new Secret("secret".Sha256()) },

    AllowedGrantTypes = GrantTypes.Hybrid,
    AllowAccessTokensViaBrowser = false,

    EnableLocalLogin = true,

    RedirectUris = { "http://localhost:5901/signin-oidc" },
    FrontChannelLogoutUri = "http://localhost:5901/signout-oidc",
    PostLogoutRedirectUris = { "http://localhost:5901/signout-callback-oidc" },

    AllowOfflineAccess = true,

    AllowedScopes = new List<string>
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        IdentityServerConstants.StandardScopes.OfflineAccess,
        "apiAccess",
    },

    RequireConsent = false,
}

--- ресурс API ---

(просто используя простой ctor для инициализации с помощью 'Name')

new ApiResource("apiAccess")

--- Custom Claims ---

new IdentityResource()
{
    Name = "appCustomClaims",
    UserClaims = new List<string>()
    {
        "customRole"
    }
}

--- код запуска ClientApp ---

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = "http://localhost:5900";
        options.RequireHttpsMetadata = false;

        options.ClientId = "idWebApp";
        options.ClientSecret = "secret";
        options.ResponseType = "code id_token";

        options.Scope.Add("profile");
        options.Scope.Add("offline_access");
        options.ClaimActions.MapUniqueJsonKey("offline_access", "offline_access");

        options.Scope.Add("appCustomClaims");
        options.ClaimActions.MapJsonKey("customRole", "customRole");

        options.Scope.Add("apiAccess");

        options.GetClaimsFromUserInfoEndpoint = true;
        options.SaveTokens = true;
        options.TokenValidationParameters.RoleClaimType = "customRole";
    });

1 Ответ

0 голосов
/ 27 апреля 2020

Почему один и тот же токен прекрасно работает для ClientApp, а вызов API - нет?

Две вещи:

  1. Время истечения доступа токен не связан с вашими действиями.

После выдачи токена JWT нельзя изменить. По умолчанию токен истекает через 3600 секунд.

Разница между приложением и API: приложение использует куки-файлы, API-токен на предъявителя.

У повара ie есть собственные логики истечения срока действия c. Это означает, что срок его действия истекает в другое время, независимо от времени истечения токена доступа, и также может поддерживаться в рабочем состоянии, поскольку повар ie может быть обновлен в отличие от токена доступа JWT.

Для offline_access вам необходимо получить новый токен доступа, используя токен refre sh. Как объяснено здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...