Как обрабатывать выход из стороннего приложения - PullRequest
1 голос
/ 05 марта 2019

У меня есть Identity-сервер, на котором запущен Identity-сервер 4. Код выхода из системы аналогичен тому, что они рекомендуют в их примере проекта .

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Logout(LogoutInputModel model)
    {
        // build a model so the logged out page knows what to display
        var vm = await BuildLoggedOutViewModelAsync(model.LogoutId);

        if (User?.Identity.IsAuthenticated == true)
        {
            // delete local authentication cookie
            await HttpContext.SignOutAsync();

            // raise the logout event
            await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));
        }

        // check if we need to trigger sign-out at an upstream identity provider
        if (vm.TriggerExternalSignout)
        {
            // build a return URL so the upstream provider will redirect back
            // to us after the user has logged out. this allows us to then
            // complete our single sign-out processing.
            string url = Url.Action("Logout", new { logoutId = vm.LogoutId });

            // this triggers a redirect to the external provider for sign-out
            return SignOut(new AuthenticationProperties { RedirectUri = url }, vm.ExternalAuthenticationScheme);
        }

        return View("LoggedOut", vm);
    }

То, что делает приведенный выше код, - это когда он выполняет предварительный выход из системы, удаляя cookie-файл для входа на сервере идентификации.

await HttpContext.SignOutAsync();

Все это создает идеальный смысл. На идентификационном сервере. Кто-то вызывает выход из системы и ее выход из системы.

Сторонние приложения

У меня проблемы со сторонними приложениями. Когда наши сторонние приложения вызывают выход из системы, они вызывают идентификационный сервер, и он удаляет cookie и возвращает выход в приложение. Однако это не совсем то, что он делает. Его выход всех.

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

Я знаю, например, что Google не разрешает сторонний выход из системы. В настоящее время я вошел в систему, используя свою учетную запись google для SO, и если я выйду из нее, это только приведет к тому, что я выйду из SO, а не из Google, и все другие мои приложения вошли в Google.

Итак, мой вопрос: как я могу запретить сторонним приложениям выходить из системы всех и при этом разрешать им выходить из системы самостоятельно?

Что я пробовал

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

Что я считаю

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

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