Выйти из клиента OIDC, не работающего с IdentityServer4

В настоящее время я работаю над приложением .NET 5 с использованием IdentityServer4.

Я использую код авторизации + поток PKCE для входа - к сожалению, выход из системы работает некорректно на localhost.

Мой ландшафт приложений выглядит так:

  • Приложение (веб-приложение)
  • IdentityServer4

Определение моего клиента в IdentityServer4 выглядит так:

// Authorization Code + PKCE Flow
new Client
{
    ClientId = "oidcClient",
    ClientName = "Example App",
    ClientSecrets = { new Secret("secret".Sha256()) },

    RedirectUris = { "https://localhost:44301/signin-oidc" },
    PostLogoutRedirectUris = { "https://localhost:44301/signout-callback-oidc" },

    AllowedGrantTypes = GrantTypes.Code,
    RequirePkce = true,
    RequireClientSecret = true,
    
    AllowedScopes = 
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        IdentityServerConstants.StandardScopes.Email,
        IdentityServerConstants.StandardScopes.OfflineAccess,
        "roles",
    },

    AllowPlainTextPkce = false,
},

Мое соединение OIDC в ​​клиентском приложении выглядит так:

services.AddAuthentication(options => 
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options => 
{
    options.Authority = "https://localhost:5001";
    options.RequireHttpsMetadata = true;
    options.ClientId = "oidcClient";
    options.ClientSecret = "secret";

    options.ResponseType = "code";
    options.UsePkce = true;
    options.ResponseMode = "query";

    options.Scope.Add("offline_access");
    options.Scope.Add("roles");
    
    options.SaveTokens = true;
});

Метод выхода из системы в моем WebApp HomeController выглядит так:

public async Task<IActionResult> Logout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);

    return new SignOutResult(new[] { OpenIdConnectDefaults.AuthenticationScheme, CookieAuthenticationDefaults.AuthenticationScheme });
}

Журналы IdentityServer4 сообщают мне об успешном входе в систему = ›Успешный вход в систему и о выходе из системы =› Успешный выход из системы.

Это странно - приложение все время остается в системе.

Когда я выхожу из системы и возвращаюсь на главную страницу индекса WebApp, я все еще в системе, хотя должен выйти.

Вы знаете, как правильно настроить выход из системы в OIDC-приложении IdentityServer4?

Вы знаете, как решить эту проблему?


person TimHorton    schedule 08.05.2021    source источник


Ответы (1)


Метод выхода из системы никогда ничего не должен возвращать. Потому что, если вы это сделаете, вы переопределите перенаправление, которое методы SignOut генерируют внутри.

Лучше сделать это:

public async Task DoLogout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
}
person Tore Nestenius    schedule 09.05.2021
comment
Спасибо, это очень хороший намек - ваш код работает очень хорошо! На самом деле в моем конкретном случае ошибка все еще возникает, когда я использую ASP.NET Identity с EF Core User Store, хотя проблем с TestUser в памяти нет ... Мне нужно немного исследовать :) - person TimHorton; 09.05.2021
comment
Возможно, проблема с миксом печенья? Имейте в виду, что сервер идентификации имеет свой собственный набор файлов cookie, а у клиента свой собственный .... - person Tore Nestenius; 09.05.2021
comment
да, так и было;) - person TimHorton; 09.05.2021