Глобальный выход клиента AspCore с IdentityServer

#asp.net #asp.net-mvc #asp.net-core #asp.net-identity #identityserver4

#asp.net #asp.net-mvc #asp.net-core #asp.net-идентификация #identityserver4

Вопрос:

в неосновном приложении asp mvc у меня было действие контроллера для глобального выхода пользователя из системы

это выглядело так

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

теперь у меня есть клиент asp core, и я хочу выйти из системы, которую я пробовал

  public async Task<ActionResult> LogOut()
        {
            if (User.Identity.IsAuthenticated)
            {
                await HttpContext.Authentication.SignOutAsync("Cookies");
            }
            return Redirect("/");
        }
  

Обновить

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

Вкратце: я выхожу из системы в своем приложении asp, но не на сервере идентификации.

Как я могу выполнить глобальный выход? Так что, мне нужно выйти из системы на сервере идентификации?

Ответ №1:

Если вы используете OpenIdConnect аутентификацию, вам также потребуется удаленный выход. Попробуйте изменить свой код примерно так, как показано ниже:

     public async Task<ActionResult> LogOut()
    {
        if (User.Identity.IsAuthenticated)
        {
            await HttpContext.Authentication.SignOutAsync("Cookies");
            await context.Authentication.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties()
            {
                 RedirectUri = "<signed out url>"
            });

            // if you use different scheme name for openid authentication, use below code
            //await context.Authentication.SignOutAsync(<your openid scheme>, new AuthenticationProperties()
            //{
            //   RedirectUri = "/signedout"
            //});
        }
        return Redirect("/");
    }
  

Смотрите оригинальный пример https://github.com/aspnet/Security/blob/dev/samples/OpenIdConnectSample/Startup.cs

Ответ №2:

Я столкнулся с той же проблемой, и для ее решения мне пришлось самостоятельно очистить файлы cookie ответа в моем приложении IdentityServer.

 var cookies = HttpContext.Request.Cookies.Keys;
foreach (var cookie in cookies)
{
    HttpContext.Response.Cookies.Delete(cookie, new CookieOptions
    {
        Domain = "localhost" // Your host name here
    });
}

// SignOutAsync depends on IdentityServer4 > Microsoft.AspNetCore.Http.Authentication
await HttpContext.Authentication.SignOutAsync();
  

Что я сделал, так это то, что когда мой клиент хочет выйти из системы, я перенаправляю его в свое приложение IdentityServer, которое очищает файлы cookie ответа, как указано выше.

В этом коде я удаляю все файлы cookie для localhost , однако вы можете добавить туда фильтр и удалить только файлы cookie, которые IdentityServer использует для сохранения аутентификации пользователя.

Ниже вы найдете более подробную информацию об этой реализации.

http://benjii.me/2016/04/single-sign-out-logout-identity-server-4/

Ответ №3:

Вот официальная документация для ASP.NET Единый выход сервера идентификации:

документация по единому выходу

Это пример, взятый из их демонстрационной реализации:

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

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

Комментарии:

1. Я бы сказал, что в данном контексте это бесполезно, поскольку мы говорим о приложении AspNetCore и используем библиотеки OWIN в управляемом коде. Однако он отлично работает в не asp.net основное приложение, использующее OWIN.