Когда выход из системы инициируется клиентским приложением MVC, которое достигает действия IdentityServer4 Logout с LogoutId. И когда служба взаимодействия получила имя await _interaction.GetLogoutContextAsync(logoutId)
, она не возвращает PostLogoutRedirectUri
даже через одно и то же значение, установленное на клиенте MVC, а также на клиенте IdentityServer.
Как получить значение PostLogoutRedirectUri для заполнения?
MVC Client startup.cs
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
.. {
PostLogoutRedirectUri = "http://localhost/Home/Index", //expected to redirect back here (so, it should be login page as logout executed.
SaveTokens = true,
..
}
MVC Выход клиента из системы:
public Task Logout()
{
AuthenticationManager.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationType);
AuthenticationManager.SignOut(CookieAuthenticationDefaults.AuthenticationType);
}
Выход с сервера идентификации 4:
[HttpGet]
public async Task<IActionResult> Logout(string logoutId)
{
var vm = await BuildLogoutViewModelAsync(logoutId);
if (vm.ShowLogoutPrompt == false)
return await Logout(vm);
return View(vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutInputModel model)
{
var vm = await BuildLoggedOutViewModelAsync(model.LogoutId);
if (User?.Identity.IsAuthenticated != true)
return View("LoggedOut", vm);
await HttpContext.SignOutAsync();
await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));
if (vm.AutomaticRedirectAfterSignOut &&
!string.IsNullOrWhiteSpace(vm.PostLogoutRedirectUri))
return Redirect(vm.PostLogoutRedirectUri);
return View("LoggedOut", vm);
}
Идентификация Клиент сервера 4:
new Client
{
ClientId = ConstantValue.ClientId,
ClientName = ConstantValue.ClientName,
AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
RequireConsent = false,
RedirectUris = { "http://localhost/Home/Index"},
PostLogoutRedirectUris = { "http://localhost/Home/Index"},
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
ConstantValue.ClientDashApi
},
IdentityTokenLifetime=120,
AccessTokenLifetime=120
},
После чего, https://identityserver4.readthedocs.io/en/release/topics/signout.html --- обновите здесь, если включить idToken в событие уведомления, проблема в том, что LogoutId
получен как ноль в identityserver выход из системы.
if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
{
var idTokenHint = context.OwinContext.Authentication.User.FindFirst("id_token");
if (idTokenHint != null)
{
context.ProtocolMessage.IdTokenHint = idTokenHint.Value;
}
}
URL-адрес сети включает следующее: (не включает id_token
post_logout_redirect_uri: http://localhost x-client-SKU: ID_NET461 x-client-ver: 5.3.0.0