Как указать несколько схем выхода по умолчанию?

Я использую WsFed для реализации единого входа ADFS в приложении. Чтобы правильно выйти, я должен указать схемы CookieAuthenticationDefaults.AuthenticationScheme и WsFederationDefaults.AuthenticationScheme для метода SignOut. Если я использую только схему cookie, я не выхожу из системы. Если я использую только схему WsFed, я выхожу из системы, но могу автоматически пройти повторную аутентификацию, если я нажму кнопку «Назад» в браузере.

На данный момент я указываю их обоих для метода SignOut. Однако я не хочу, чтобы эти схемы были в нескольких местах (Startup.cs и действие контроллера).

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

Действие выхода:

[AllowAnonymous]
[HttpGet]
public IActionResult Logout()
{
    return SignOut(
        new AuthenticationProperties
        {
            RedirectUri = Url.Action("LoggedOutSuccessfully", "NameController"),
        },
        WsFederationDefaults.AuthenticationScheme,
        CookieAuthenticationDefaults.AuthenticationScheme);
}

Схема Startup.cs по умолчанию настроена:

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;

    //need two schemes here (or somewhere) instead of one
    sharedOptions.DefaultSignOutScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
    //... WsFed options
})
.AddCookie(options =>
{
    //... cookie options
});

person Lukas    schedule 11.02.2020    source источник


Ответы (1)


Короткий ответ: нет, вы не можете комбинировать несколько схем по умолчанию.

Причина этого в основном связана с тем, какие схемы могут быть: схема файлов cookie на самом деле является одной из самых простых схем, из которых вы можете выйти, потому что ей просто нужно очистить файлы cookie пользователя и, как таковые, не требуется собственный HTTP-ответ. Вместо этого он может быть объединен с другим ответом, например, с ответом удаленной схемы, выходящей из удаленного провайдера аутентификации.

WS-Federation - это схема удаленной проверки подлинности, что в основном означает, что она полагается на поставщика удаленной проверки подлинности для фактического выполнения проверки подлинности пользователя. В большинстве случаев вход в систему с помощью удаленного поставщика проверки подлинности означает, что этот поставщик также будет создавать сеанс пользователя самостоятельно, так что последующие запросы проверки подлинности могут полагаться на уже существующий сеанс пользователя для проверки подлинности пользователя, не запрашивая их учетные данные. Это также основа единого входа для нескольких приложений: вы входите в систему один раз с помощью центрального поставщика аутентификации, и все приложения могут прозрачно аутентифицировать пользователя, не запрашивая их повторной аутентификации.

Для процесса выхода это, к сожалению, означает, что для удаленного выхода пользователя из системы пользователь должен быть отправлен именно этому провайдеру аутентификации для выхода (просто потому, что вы не можете очистить cookie сами). Обычно это делается с перенаправлением на страницу выхода поставщика аутентификации. А поскольку перенаправление - это один HTTP-ответ, вы можете комбинировать его с выходом из файла cookie, но не с другим выходом с удаленной аутентификацией.

В зависимости от протокола и возможностей провайдера протокол может позволить вам указать URL-адрес возврата, на который пользователь будет перенаправлен обратно после успешного выхода. Этот механизм можно использовать для цепочки выхода из системы с несколькими обработчиками аутентификации, каждый из которых требует своего собственного HTTP-ответа. Но вам придется справиться с этим самостоятельно.

В конце концов, это также действительно ваш выбор, хотите ли вы выйти из системы удаленно. В зависимости от ваших настроек вы можете захотеть выйти из системы только локально (через схему файлов cookie), но сохранить их в системе с помощью их удаленного обработчика аутентификации. Таким образом, выбирая схемы при выходе, вы также можете контролировать это.

person poke    schedule 11.02.2020
comment
Poke, ваши подробные объяснения очень помогли мне понять, как работает аутентификация. Большое тебе спасибо. - person Lukas; 12.02.2020