Ошибка автоматического обновления Identity Server 4 Ответ: login_required

Я клонировал репо из redux-oidc-example, и он по большей части работает но через несколько часов выдает следующую ошибку:

Полезные данные действия: ErrorResponse: login_required
at new e (oidc-client.min.js: 1)
at t [as _processSigninParams] (oidc-client.min.js: 1)
at t [как validateSigninResponse] (oidc-client.min.js: 1)
в oidc-client.min.js: 1

UserManager.js выглядит так:

const userManagerConfig = {
  client_id: 'js.dev',
  client_secret: 'secret',
  redirect_uri: `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}/callback`,
  response_type: 'id_token token',
  scope: 'openid email profile role offline_access',
  authority: 'http://localhost:8080',
  silent_redirect_uri: `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}/silent_renew.html`,
  automaticSilentRenew: true,
  filterProtocolClaims: true,
  loadUserInfo: true
};

и моя конфигурация сервера идентификации:

{
        "Enabled": true,
        "ClientId": "js.dev",
        "ClientName": "Javascript Client",
        "ClientSecrets": [ { "Value": "K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=" } ],
        "AllowedGrantTypes": [ "implicit", "authorization_code" ],
        "AllowedScopes": [ "openid", "email", "profile", "role", "offline_access" ],
        "AllowOfflineAccess": true,
        "AllowAccessTokensViaBrowser":true,
        "RedirectUris": [
          "http://localhost:8081/callback",
          "http://localhost:8081/silent_renew.html"
        ],
        "PostLogoutRedirectUris": [
          "http://localhost:8081"
        ],
        "AccessTokenLifetime": 900,
        "RequireConsent": false
      }

Я заметил, что до ошибки последний действительный ответ имел один ответ cookie (idsrv.session) с пустым значением с датой истечения срока действия, установленной на предыдущий год:

idsrv.session cookie

Я считаю, что это основная причина проблемы, я поискал ее в соответствующем репозитории Github и попытался добавить Cookie.SameSite в none, но это не помогло:

services.AddAuthentication()
                .AddSaml(Configuration,externalProviders.UseSaml)
                .AddCookie(options => {
                    options.SlidingExpiration = true;
                    options.ExpireTimeSpan = TimeSpan.FromDays(30);
                    options.Cookie.SameSite = SameSiteMode.None;
                });

Любая идея!


person Attiqe    schedule 19.11.2019    source источник


Ответы (3)


Вероятно, это связано с истечением срока действия вашего сеанса IDP - если вы вызываете конечную точку authorize с prompt=none, но она не может удовлетворить этот запрос, потому что не существует действительного сеанса (т.е. cookie аутентификации не существует или истек), тогда он вернет error=login_required.

Если это произойдет, то правильным курсом действий является выполнение интерактивного (т.е. prompt=login) запроса входа в систему в окне браузера верхнего уровня.

person mackie    schedule 20.11.2019

После поиска в репозитории Identity Server 4 я внес следующие изменения в свой код:

services.AddIdentityServer(options=>
                {
                    options.Authentication.CookieLifetime = TimeSpan.FromDays(30);
                    options.Authentication.CookieSlidingExpiration = true;
                })
                .AddProfileService<ProfileService>()
                .AddSigningCertificate(Configuration)
                .AddInMemoryClients(Configuration.GetSection("IdentityServer:Clients"))
                .AddInMemoryIdentityResources(Resources.GetIdentityResources());

Позже он начал работать, но вам придется снова войти в систему после закрытия браузера или повторного открытия новой вкладки, я думаю, это из-за sessionStorage.

person Attiqe    schedule 21.11.2019
comment
У меня такая же проблема. Удалось ли наконец решить свой вопрос? - person Enrico Massone; 15.09.2020
comment
не могли бы вы сообщить о своем методе ConfigureServices полностью? Если хотите, можете прокомментировать мой собственный вопрос stackoverflow.com/questions/63901667/ - person Enrico Massone; 15.09.2020
comment
Конечно, здесь достаточно места, я опубликую ваш вопрос. - person Attiqe; 15.09.2020

Когда сеанс истекает, STS вызывает обратный вызов входа, имеющий параметр запроса, называемый 'error', со значением 'login_required'.

В обратном вызове входа перед завершением входа вы можете проверить этот параметр запроса, и, если он найден, вы также можете выйти из системы из своего веб-клиента.

Снимок экрана сетевых запросов на авторизацию и вход в систему с обратным вызовом

person Rami    schedule 21.08.2020