Как перенаправить пользователя на клиентское приложение после выхода с сервера идентификации? - PullRequest
1 голос
/ 06 июня 2019

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

Единственное, что я пробовал, это использовать PostLogoutRedirectUri в AccountController при быстром запуске, но значение всегда равно нулю. Обходной путь, который я нашел, состоит в том, чтобы вручную установить PostLogoutRedirectUri, который отлично работает, если у вас есть только один клиент на сервере, но не так много, если у меня есть несколько. Есть ли способ узнать, какой клиент "вышел" из системы?

  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);
        }


        vm.PostLogoutRedirectUri = "http://localhost:56582";
        return Redirect(vm.PostLogoutRedirectUri);
    }

Мой клиент

 new Client
                {

                    ClientId =  "openIdConnectClient",
                    ClientName = "Implicit Client Application Name",
                    AllowedGrantTypes = GrantTypes.Implicit,
                    AllowedScopes = new List<string>
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        IdentityServerConstants.StandardScopes.Email,
                        "role",
                        "customAPI.write"
                    },

                    RedirectUris = new List<string>{ "http://localhost:56582/signin-oidc" },
                    PostLogoutRedirectUris = new List<string>{ "http://localhost:56582" },
                   // FrontChannelLogoutUri = "http://localhost:56582/signout-oidc"

                }

1 Ответ

1 голос
/ 14 июня 2019

Вы не должны устанавливать URI вручную. На самом деле метод выхода по умолчанию из примеров IdentityServer работает нормально.

Когда вы попробуете пример проекта 3_ImplicitFlowAuthentication , вы увидите, что PostLogoutRedirectUri не равно нулю и перенаправление работает (но не автоматически).

Причина, по которой PostLogoutRedirectUri равен null в вашем случае, возможно, заключается в том, что id_token не сохраняется. В MvcClient.Startup убедитесь, что вы добавили эту строку:

options.SaveTokens = true;

Это сохранит токены в куки.

Чтобы автоматически перенаправить обратно на клиент, внесите несколько изменений в пример кода. В IdentityServer AccountOptions установлено

AutomaticRedirectAfterSignOut = true;

В методе AccountController.Logout добавьте следующие строки:

if (vm.AutomaticRedirectAfterSignOut && 
               !string.IsNullOrWhiteSpace(vm.PostLogoutRedirectUri))
    return Redirect(vm.PostLogoutRedirectUri);

Прямо перед последней строкой:

return View("LoggedOut", vm);

Когда вы снова запустите образец, вы увидите, что пользователь автоматически возвращается к клиенту после выхода из системы.

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