Значение LogoutId равно нулю, что приводит к тому, что PostLogoutRedirectUri всегда равно нулю (выход из системы инициирован из клиента MVC) - PullRequest
0 голосов
/ 10 марта 2020

Когда выход из системы инициируется клиентским приложением 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

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