IdentityServer4 - Перенаправление на клиент MVC после выхода из системы

Я использую IdenetityServer4 и перенаправляю на клиент MVC после выхода из системы. Ниже приводится действие моего выхода из системы с клиентским контроллером MVC:

public async Task Logout()
{
    await HttpContext.Authentication.SignOutAsync("Cookies");
    await HttpContext.Authentication.SignOutAsync("oidc");
}

Ниже приведен файл конфигурации хоста сервера идентификации 4.

public static IEnumerable<Client> GetClients()
{
    return new List<Client>
    {
        // other clients omitted...

        // OpenID Connect implicit flow client (MVC)
        new Client
        {
            ClientId = "mvc",
            ClientName = "MVC Client",
            AllowedGrantTypes = GrantTypes.Implicit,

            // where to redirect to after login
            RedirectUris = { "http://localhost:58422/signin-oidc" },

            // where to redirect to after logout
            PostLogoutRedirectUris = { "http://localhost:58422/signout-callback-oidc" },

            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile
            }
        }
    };
} 

Я хочу, чтобы пользователь был перенаправлен обратно на клиент MVC после выхода из системы IdentityServer. Прямо сейчас пользователь должен щелкнуть ссылку, показанную на изображении ниже, чтобы перенаправить обратно на сайт MVC, но я думаю, что пользователь должен автоматически перенаправляться обратно на клиент MVC.

введите описание изображения здесь


person Sandeep    schedule 06.04.2017    source источник
comment
поделитесь пожалуйста ошибкой и доп логами.   -  person Lutando    schedule 06.04.2017


Ответы (3)


Нет проблем в вашем Config.cs или в контроллере MVC.

Перейдите в свое приложение IdentityServer4, затем в методе Logout [HttpPost] AccountController внесите следующие изменения:

public async Task<IActionResult> Logout(LogoutViewModel model)
{
   ...    
  //return View("LoggedOut", vm);
  return Redirect(vm.PostLogoutRedirectUri);
}

Это перенаправит пользователя обратно в приложение MVC (в вашем случае).

Есть лучший способ сделать это: вы можете установить эти параметры из AccountOptions.cs следующим образом:

public static bool ShowLogoutPrompt = false;
public static bool AutomaticRedirectAfterSignOut = true;
person heyAkhilesh    schedule 11.04.2017
comment
У меня такая же конфигурация клиента, как у @Sandeep, включая PostLogoutRedirectUris, но когда я запускаю проект в режиме отладки, я вижу, что vm.PostLogoutRedirectUri имеет значение null. Есть идеи, почему? - person CodeEngine; 24.05.2017
comment
Требуются дополнительные разъяснения. Вы пытались выйти из клиента во время отладки? Потому что vm.PostLogoutRedirectUri будет установлен, когда запрос выхода из системы получен от любого из настроенных клиентов. - person heyAkhilesh; 01.06.2017
comment
то же самое здесь vm.PostLogoutRedirectUri имеет значение null - person David; 14.11.2018

Если кто-то использует Scaffolding (они используют файлы Razor Page), вот как это исправить в соответствии с ответом Ахилеша:

В Areas \ Identity \ Pages \ Account \ Logout.cshtml:

Сначала добавьте IIdentityServerInteractionService сервис:

    IIdentityServerInteractionService _interaction;

    public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger, IIdentityServerInteractionService _interaction)
    {
        _signInManager = signInManager;
        _logger = logger;
        this._interaction = _interaction;
    }

Возможно, вам потребуется добавить поддержку OnGet(), логика может отличаться в зависимости от вашего случая, в моем случае Get или Post не имеет значения:

    public async Task<IActionResult> OnGet(string returnUrl = null)
    {
        return await this.OnPost(returnUrl);
    }

Добавьте логику LogoutId в OnPost:

    public async Task<IActionResult> OnPost(string returnUrl = null)
    {
        await _signInManager.SignOutAsync();
        _logger.LogInformation("User logged out.");

        var logoutId = this.Request.Query["logoutId"].ToString();

        if (returnUrl != null)
        {
            return LocalRedirect(returnUrl);
        }
        else if (!string.IsNullOrEmpty(logoutId))
        {
            var logoutContext = await this._interaction.GetLogoutContextAsync(logoutId);
            returnUrl = logoutContext.PostLogoutRedirectUri;

            if (!string.IsNullOrEmpty(returnUrl))
            {
                return this.Redirect(returnUrl);
            }
            else
            {
                return Page();
            }
        }
        else
        {
            return Page();
        }
    }
person Luke Vo    schedule 10.11.2018
comment
Это правильный ответ для сценария Scaffolding. Спасибо, что поделился. Я дергал себя за волосы, пытаясь понять, почему post_logout_redirect_uri / returnUrl не передается моему действию выхода из системы. - person Petar Ivanov; 19.02.2019
comment
В моем случае Request.Query [logoutId] возвращает пустое значение, хотя я вижу его в URL-адресе запроса. Вы можете мне помочь? - person Kishan Vaishnav; 14.06.2021

Никакого дополнительного кода не требуется. Вы должны убедиться, что Model.AutomaticRedirectAfterSignOut = true и signout-redirect.js существует в wwwroot / js и в LoggedOut.cshtml.

@if (Model.AutomaticRedirectAfterSignOut)
    {
        <script src="~/js/signout-redirect.js"></script>
    }

делает всю работу (см. код ниже)

window.addEventListener("load", function () {
    var a = document.querySelector("a.PostLogoutRedirectUri");
    if (a) {
        window.location = a.href;
    }
});

таким образом пользователь перенаправляется на mvc из LoggedOut.cshtml

person Lapenkov Vladimir    schedule 18.08.2020