У меня есть 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. Это не сработало, потому что приложение просто снова проверяет идентификационный сервер и говорит, что он все еще зарегистрирован. Должен быть способ выхода из сторонних приложений и входа в систему только по запросу пользователя. Я рассмотрел вопрос об удалении согласия пользователей, но это также не сработало, поскольку в следующий раз они должны будут дать согласие при входе в систему.
Что я считаю
Я подумал сказать нашим сторонним разработчикам, что им нужно иметь фиктивное представление с кнопкой входа в систему, чтобы пользователям приходилось нажимать эту кнопку, а не благодарность за то, что они связались напрямую с именем входа на сервере идентификации. Я не думаю, что это решение будет очень популярным среди разработчиков.