Как ADFS поддерживает аутентификацию пользователя? - PullRequest
0 голосов
/ 10 февраля 2020

Я использую WsFed для реализации ADFS SSO в приложении. Если я попытаюсь запустить [Authorize] методы, я попаду на страницу входа. Когда я вхожу, создается повар ie с зашифрованной информацией, и я могу запускать методы [Authorize]. Повар ie имеет вариант ExpireTimeSpan = TimeSpan.FromSeconds(10);. Пока что это работает, как и ожидалось, и неавторизованный пользователь не может получить доступ к приложению.

Путаница начинается, когда срок действия повара ie истекает, изменяется или удаляется из браузера. Когда это происходит, если я запускаю метод [Authorized], я автоматически вхожу снова без необходимости повторного ввода учетных данных, и повар ie воссоздается. Однако, если я явно выйду из системы с помощью метода return SignOut(..., мне потребуется повторно ввести свои учетные данные.

Почему ADFS повторно аутентифицирует меня, если я удаляю повар ie, и как он узнает об этом? Сделай так? Он не делает этого, если я явно выйду из системы. Разве оставшиеся аутентифицированные не должны зависеть от наличия повара ie с правильными значениями?

Настройка аутентификации в Startup.ConfigureServices:

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
    options.Wtrealm = Configuration["AppSettings:wsfed:realm"];
    options.MetadataAddress = Configuration["AppSettings:wsfed:metadata"];
    options.UseTokenLifetime = false;
})
.AddCookie(options =>
{
    options.Cookie.Name = "AuthenticationCookie";
    options.LoginPath = "/signin-wsfed";
    options.LogoutPath = "/NameController/Logout";
    options.ExpireTimeSpan = TimeSpan.FromSeconds(10);
    options.SlidingExpiration = true;
});

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

[AllowAnonymous]
[HttpGet]
public IActionResult Login()
{
    var authProperties = new AuthenticationProperties
    {
        RedirectUri = "https://app:1234/NameController/Index",
    };

    return Challenge(authProperties, WsFederationDefaults.AuthenticationScheme);
}

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

[AllowAnonymous]
[HttpGet]
public IActionResult SignOutOfADFS()
{
    return SignOut(
        new AuthenticationProperties
        {
            RedirectUri = "https://app:1234/NameController/AfterLogout"
        },
        CookieAuthenticationDefaults.AuthenticationScheme,
        WsFederationDefaults.AuthenticationScheme);
}

1 Ответ

1 голос
/ 10 февраля 2020

AD FS - это поставщик удостоверений, который обычно используется для целей единого входа. Как часть этого, ключевой особенностью является то, что AD FS запоминает зарегистрированного пользователя, чтобы аутентифицировать его для другого веб-сайта. Он делает это, вспоминая, как пользователь продолжал использовать отдельный сеанс, используя cook ie для веб-сайта AD FS.

Когда вы выходите из приложения локально, все, что вы делаете, это очищаете ваш местный повар ie. Поэтому, когда вы пытаетесь снова пройти проверку подлинности, и пользователю предлагается выполнить проверку подлинности с помощью поставщика удостоверений, AD FS может войти в систему, не запрашивая у них его учетные данные еще раз. Тогда для AD FS ваше приложение похоже на третий веб-сайт, который запрашивает аутентификацию после того, как пользователь уже вошел в AD FS.

Чтобы полностью выйти из системы, вам нужно будет сделать знак WSFederation. вне. В рамках этого процесса локальный повар ie очищается, а затем пользователь перенаправляется на страницу выхода из AD FS, где также очищается повар аутентификации AD FS ie. При последующей попытке аутентификации AD FS больше не может запомнить пользователя (так как нет cook ie), поэтому они должны снова аутентифицироваться со своими учетными данными. Это то, что вы делаете в своем SignOutOfADFS действии.

Протокол WSFederation поддерживает способ для приложения аутентификации требовать от пользователя повторной аутентификации у провайдера идентификации, передавая параметр wfresh=0 с запросом аутентификации. Это также поддерживается в текущих версиях AD FS. К сожалению, я не думаю, что этот параметр в настоящее время поддерживается обработчиком аутентификации WSFederation для ASP. NET Core. Однако это не помешает пользователю повторно использовать свою аутентификацию, поэтому вы не сможете использовать эту функцию безопасности.

...