Есть ли у пользователя активная сессия на IDMsrv?

Как проверить, есть ли у IDM активный сеанс для входа пользователя?

подробности — если у пользователя «А» есть активный сеанс в IDM из браузера «X», когда тот же пользователь «А» пытается войти в систему с помощью браузера «Y», ожидаемое поведение идентифицирует, что у пользователя есть активный сеанс, и делает браузер «X» недействительным. сессия.

Фон-

IDM с клиентом aspnetIdentity с неявным грантом (30-секундный срок действия токена идентификации, он продолжает обновлять токен доступа молча, не переходя на страницу входа в систему, ожидается, что будет использован какой-либо метод в IDM, после чего я смогу проверить, есть ли у пользователя доступ или нет)!!


person Jay    schedule 28.08.2017    source источник


Ответы (1)


Брок уже упоминал об этом, это должно быть во время входа и выхода

Это имеет смысл, почему его нет в Idm. но определенно возможно предоставить это как расширенную функцию, по крайней мере, в следующих версиях.

Служба профилей, метод IsActive является одним из конечных точек авторизации и проверки маркеров.

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

пока сеанс активен (время жизни файла cookie), автоматическая аутентификация будет проходить с помощью логики приложения. поэтому это также можно контролировать с помощью времени жизни файлов cookie.

public override async Task IsActiveAsync(IsActiveContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await userManager.FindByIdAsync(sub);

        //Check existing sessions
        if (context.Caller.Equals("AccessTokenValidation", StringComparison.OrdinalIgnoreCase))
        {
            if (user != null)
                context.IsActive = !appuser.VerifyRenewToken(sub, context.Client.ClientId);
            else
                context.IsActive = false;
        }
        else
            context.IsActive = user != null;
    }

войти

 public async Task<IActionResult> Login(LoginInputModel model)
    {
        if (ModelState.IsValid)
        {

            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberLogin, false);
            if (result.Succeeded)
            {

                //Update security stamp to invalidate existing sessions 
                //TODO: This didn't invalidate the existing cookie from another client
                //var test= _userManager.UpdateSecurityStampAsync(_userManager.FindByEmailAsync(model.Email).Result).Result;


                appUser.PersistSession(new UserSession
                {
                    CreatedOn = DateTimeOffset.Now,
                    DeviceUniqueId = GetDeviceId(),
                    UserId = _userManager.FindByNameAsync(model.Email).Result.Id,
                    SId = httpContext.HttpContext.Session.Id, 
                    ClientId= httpContext.HttpContext.Request.QueryString.Value.GetClientIdFromQuery(),
                    ExpiresOn = DateTimeOffset.Now.AddMinutes(appSettings.SessionTimeOut)
                });                    
                _logger.LogInformation(1, "User logged in.");
                return RedirectToLocal(model.ReturnUrl);
            }

У этого метода есть несколько недостатков, когда IIS перезапускается и если пользователь не вышел из системы должным образом.

могут быть лучшие варианты, это не лучший вариант.!

Обновление: см. здесь дубликат/похожий вопрос< /а>

на конечных точках idmsrv отсутствует проверка безопасности

Поднята проблема

Должно быть так @tibold

person Jay    schedule 04.09.2017