Identity Server 4 - выход пользователя из системы при простое - PullRequest
0 голосов
/ 08 февраля 2019

Hej Community,

Я застрял, и мне нужен совет или указатель на решение.У меня довольно простая установка Identity Server 4:

  1. Identity Server 4 с ASP.NET Identity
  2. Клиент ASP.NET Core 2.2 MVC

Iхотел бы автоматически выйти из системы через 10 минут бездействия.В приведенном ниже примере я использовал 10 с, чтобы сделать тестирование несколько быстрее.Аутентификация, перенаправление и принудительный выход пользователя работают, как ожидалось, и выглядят как заклинание, используя код ниже.Однако, когда пользователь бездействует дольше, чем заданные 10 с, он все еще входит в систему и не перенаправляется на страницу входа в систему на хосте IDS.

Клиент MVC настраивается с использованием Hybrid Grant как:

Определение клиента

var mvcClient = new Client
{
    ClientId = "account-mvc",
    ClientName = "Account MVC",
    ClientUri = "https://localhost:5002",

    AllowedGrantTypes = GrantTypes.Hybrid,
    ClientSecrets = { new Secret("secret".Sha256()) },

    EnableLocalLogin = true,
    RequireConsent = false,
    AllowOfflineAccess = false,
    AccessTokenLifetime = 10,   // 10 s by intention
    IdentityTokenLifetime = 10, // 10 s by intention

    RedirectUris = "https://localhost:5002/signin-oidc",
    PostLogoutRedirectUris = "https://localhost:5002/signout-callback-oidc",
    FrontChannelLogoutUri = "https://localhost:5002/signout-oidc",

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        IdentityServerConstants.StandardScopes.Email,
    },
};

Параметры сервера идентификации

services.AddIdentityServer(options =>
{
    options.Authentication.CheckSessionCookieName = "auth-cookie";
    options.Authentication.CookieLifetime = new System.TimeSpan(0, 0, 10);
    options.Authentication.CookieSlidingExpiration = false;

    options.Csp.Level = IdentityServer4.Models.CspLevel.Two;

    options.Events.RaiseErrorEvents = true;
    options.Events.RaiseInformationEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.Events.RaiseSuccessEvents = true;
})
.Add... // Left out for brevity

При запуске клиента MVC я добавляю:

Запуск клиента MVC

services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("Cookies", options => 
        {
            options.ExpireTimeSpan = TimeSpan.FromSeconds(10);
            options.SlidingExpiration = false;
            options.Cookie.Name = "mvc-cookie";
        })
        .AddOpenIdConnect("oidc", options =>
        {
            options.SignInScheme = "Cookies";

            options.Authority = "https://localhost:5001/";
            options.ClientId = "account-mvc";
            options.ClientSecret = "secret";
            options.ResponseType = "code id_token";

            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;

            options.Scope.Add("openid");
            options.Scope.Add("profile");
            options.Scope.Add("email");
        });

и добавлено app.UseAuthentication() в методе Configure.

Вопрос

Как я могу убедиться, что пользователь вышел из системы на Identity Server после истечения времени сеанса?Любая подсказка и помощь приветствуются!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

После дополнительной отладки я обнаружил, что время жизни cookie-файла клиента MVC работало так, как предполагалось, со скользящим сроком действия.Однако, как только срок действия файла cookie истек, был установлен Idenity Server (IDS), и файл cookie был обновлен, так как сеанс был еще активен / активен в IDS.

Я рассчитал два решения, из которых я решил использовать Решение 1 на данный момент и посмотрите, является ли оно наиболее подходящим в долгосрочной перспективе.

Если у кого-то есть комментарий или рекомендация относительно безопасности и передового опыта, пожалуйста, прокомментируйте или опубликуйте другое решение.

Решение 1. Максимальное время жизни единого входа клиента

Свойство Client UserSsoLifetime (доступно в Identity Server 4 из v2.3) можно использовать для установки максимального времени допользователь должен повторно пройти аутентификацию для использования клиента.Таким образом, для примера вопроса единственным необходимым дополнением является Определение клиента путем добавления UserSsoLifetime = 10, например,

Определение клиента

var mvcClient = new Client
{
    ClientId = "account-mvc",
    ClientName = "Account MVC",
    ClientUri = "https://localhost:5002",

    AllowedGrantTypes = GrantTypes.Hybrid,
    ClientSecrets = { new Secret("secret".Sha256()) },

    EnableLocalLogin = true,
    RequireConsent = false,
    AllowOfflineAccess = false,
    UserSsoLifetime = 10,       // <- HERE
    AccessTokenLifetime = 10,   // 10 s by intention
    IdentityTokenLifetime = 10, // 10 s by intention

    RedirectUris = "https://localhost:5002/signin-oidc",
    PostLogoutRedirectUris = "https://localhost:5002/signout-callback-oidc",
    FrontChannelLogoutUri = "https://localhost:5002/signout-oidc",

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        IdentityServerConstants.StandardScopes.Email,
    },
};

Это заставит пользователя повторно пройти аутентификацию после 10 с бездействия.

Решение 2: Свойство OIDC

Этот SO вопрос решает проблему с помощьюСвойство OIDC, которое можно использовать для принудительной повторной аутентификации пользователя через приглашение входа в систему после истечения сеанса - см. @ ответ Скотти Брейди .

Так что для примера, обозначенного в вопросе, следуетвыглядеть следующим образом.Обратите внимание, что изменения нужны только клиенту MVC, а именно было удалено время жизни Cookie и были добавлены опции OIDC, что привело к повторной аутентификации и использованию времени жизни токена из IDS (каждая строка отмечена // <- HERE).Таким образом, используются настройки файлов cookie из IDS (скользящее время жизни 10 с).

Запуск клиента MVC

services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("Cookies") // <- HERE
        .AddOpenIdConnect("oidc", options =>
        {
            options.SignInScheme = "Cookies";

            options.Authority = "https://localhost:5001/";
            options.ClientId = "account-mvc";
            options.ClientSecret = "secret";
            options.ResponseType = "code id_token";

            options.UseTokenLifetime = true; // <- HERE
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;

            options.Events.OnRedirectToIdentityProvider = context => // <- HERE
            {                                                        // <- HERE
                context.ProtocolMessage.Prompt = "login";            // <- HERE
                return Task.CompletedTask;                           // <- HERE
            };                                                       // <- HERE

            options.Scope.Add("openid");
            options.Scope.Add("profile");
            options.Scope.Add("email");
        });
0 голосов
/ 08 февраля 2019

Вы можете использовать Конечная точка конечного сеанса IdentityServer.

Конечная точка конечного сеанса может использоваться для запуска единого выхода ( см. Спецификацию ).

Чтобы использовать конечную точку конечного сеанса, клиентское приложение перенаправит браузер пользователя на URL-адрес конечного сеанса.Все приложения, в которые пользователь вошел в систему через браузер во время сеанса пользователя, могут участвовать в выходе.

Эту конечную точку можно использовать для перенаправления конечного пользователя обратно на страницу входа с помощью post_logout_redirect_uri параметр.

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