Мы используем Identity Server 4 для защиты веб-приложения и API. Эта часть процесса работает, пользователи могут войти и получить доступ к различным частям приложения. Проблема, с которой я сталкиваюсь, заключается в том, что во время выхода из системы мне нужно передать значение на Identity Server по одной из двух причин. Либо выход произошел из-за того, что пользователь нажал кнопку выхода из системы (поток по умолчанию), либо пользователь был неактивен в течение X минут (пользовательский процесс).
Я потратил много времени на чтение и просмотр документации Identity Server 4, и кажется, что, хотя они указывают на то, что это возможно, нет примера. Я пытался найти способ передачи / отправки значения во время выхода из Identity Server 4 и не смог найти ответ. Многие результаты говорят об установке RedirectUri для объекта AuthenticationProperties и добавлении этого в метод HttpContext.SignOutAsync()
. Я сделал это и не видел PostLogoutRedirectUri изменения LogoutContext. Я удостоверился, что добавил 2 версии URL (по умолчанию и пользовательский процесс) в список клиентов RedirectUris.
Может кто-нибудь указать мне, что я делаю неправильно?
ОБНОВЛЕНИЕ:
Мы используем ASP. NET MVC Core 2.1 для клиента и Identity Server 4 v2.3.2 для полномочий.
Выход из системы и отмена токенов работает как надо с HttpContext.SignOutAsync()
- проблема в том, что на клиенте есть две опции: пользователь может нажать кнопку выхода из системы, вызвав действие выхода из системы, или сценарий запускает отправку действия выхода из системы. в значении. Мне нужно иметь возможность выполнить обычный процесс выхода из системы и в конечном итоге отображать 1 из 2 различных сообщений в зависимости от того, как был инициирован выход из системы.
ОБНОВЛЕНИЕ2:
Поскольку я опубликовав это, я проделал некоторую работу с чистым проектом - теперь я знаю, что LocalRedirect()
не будет работать для меня, так как хосты различаются между полномочиями и клиентами. т.е.: Клиент - https://client.company.com, Полномочия: https://auth.company.com.
Полномочия
public async Task Logout(string logoutid)
{
var logoutContext = _interaction.GetLogoutContextAsync(logoutid);
var postLogOutRedirectUri = logoutContext.Result.PostLogoutRedirectUri;
await _signInManager.SignOutAsync();
LocalRedirect(postLogOutRedirectUri);
}
MVC клиент
public async Task Logout(string value = null)
{
await HttpContext.SignOutAsync("Cookies");
//custom logout process
if (!string.IsNullOrWhiteSpace(value))
{
var authProperties = new AuthenticationProperties()
{
RedirectUri = $"{_config["IdentityServer:MvcClient"]}/{RedirectToAction().UrlHelper.Action("Idle", "Home")}"
};
await HttpContext.SignOutAsync("oidc", authProperties);
return;
}
//default logout process
await HttpContext.SignOutAsync("oidc");
}