Identity Server 4 не удаляет куки - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть front front app 5 и backend api на c # с использованием сервера идентификации.Проблема в том, что когда я нажимаю кнопку выхода из системы, токен удаляется, и я перенаправляюсь на страницу выхода из системы.

Но когда я пытаюсь обновить главную страницу, меня перенаправляют на microsoftonline.com, аутентифицируемый автоматически, и перенаправляют обратно на главную страницу. Мне не хватает, предоставляя здесь имя пользователя и пароль, и это происходит в chrome incognito.

Что я заметил, так это то, что если я вручную удалю файл cookie с сайта microsoftonline.com и повторите процесс, на этот раз у меня спросят имя пользователя и пароль.

Итак, сначала я попытался очистить все файлы cookie таким образом, но это не помогло

foreach (var key in HttpContext.Request.Cookies.Keys)
{
    HttpContext.Response.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddDays(-1) });
}

ниже приведен метод выхода из системы моего аккаунта-контроллера и экран cookie

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutViewModel model)
{
    var idp = User?.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;
    var subjectId = HttpContext.User.Identity.GetSubjectId();

    if (idp != null && idp != IdentityServerConstants.LocalIdentityProvider)
    {
        if (model.LogoutId == null)
        {
            model.LogoutId = await interaction.CreateLogoutContextAsync();
        }

        try
        {
            await signInManager.SignOutAsync();
        }
        catch (NotSupportedException)
        {
        }
    }

    // set this so UI rendering sees an anonymous user
    HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity());

    // get context information (client name, post logout redirect URI and iframe for federated signout)
    var logout = await interaction.GetLogoutContextAsync(model.LogoutId);

    var vm = new LoggedOutViewModel
    {
        PostLogoutRedirectUri = logout?.PostLogoutRedirectUri,
        ClientName = logout?.ClientId,
        SignOutIframeUrl = logout?.SignOutIFrameUrl
    };

    await persistedGrantService.RemoveAllGrantsAsync(subjectId, "angular2client");

    return View("LoggedOut", vm);
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если я правильно понимаю, вы входите в Microsoft из службы IdentityServer4?Если это так, когда вы выходите из своей службы идентификации, вы также должны дать пользователю возможность выйти из внешнего провайдера (если он поддерживает соответствующую функцию - ему нужно будет определить end_session_endpoint в документе обнаружения).

Эта функция поддерживается стандартным промежуточным программным обеспечением OIDC, поэтому вы должны иметь возможность инициировать выход из системы, вызвав SignoutAsync () и передав имя схемы для федеративного входа MS.

Другой вариантвсегда отправлять prompt=login в запросах на внешний вход, а затем проверять auth_time заявление, которое вы получите.Таким образом, вы всегда заставляете интерактивный вход, а также проверяете, когда это произошло.

0 голосов
/ 28 ноября 2018

Попробуйте очистить куки-файлы от самого HttpContext, используя метод расширения, предоставленный Identity Server, например здесь .

Или попробуйте это:

await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);

в вашем методе контроллера Logout.

3-й вариант (то, что у меня есть в одном из моих тестовых клиентов MVC):

    public ActionResult Logout()
    {
        Request.GetOwinContext().Authentication.SignOut();
        return Redirect("/");
    }

    public void SignoutCleanup(string sid)
    {
        var cp = (ClaimsPrincipal)User;
        var sidClaim = cp.FindFirst("sid");
        if (sidClaim != null && sidClaim.Value == sid)
        {
            Request.GetOwinContext().Authentication.SignOut("Cookies");
        }
    }

Где метод Logout вызывается при нажатии кнопки,и SignoutCleanup - это тот, который передается на Identity Server при регистрации клиента как Client.BackChannelLogoutUri (или Client.FrontChannelLogoutUri, или оба, в зависимости от вашего сценария).

PS : Теперь, в общем, я думаю, что ваш подход не верен, но я не знаю вашего полного случая, поэтому я не осуждаю вас - просто даю и советую.

Для клиентов переднего плана(Angular, Vue, vanilla JS и т. Д.). Рекомендуется использовать клиентскую библиотеку oidc-client-js здесь является примером использования.Как я уже сказал - это всего лишь совет, но если вы находитесь в самом начале настройки аутентификации, я бы порекомендовал вам посмотреть.

...