Как WS-Federation аутентифицирует пользователя с помощью ADFS? - PullRequest
0 голосов
/ 05 февраля 2020

В веб-приложении, над которым я работаю, я реализовал вход с ADFS-провайдером WS-Federation без идентификации. Я следовал руководству от Microsoft , и оно работает.

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

Чего я не понимаю, так это где хранится тот факт, что я заверен? При входе в систему создается повар ie, но я могу вручную удалить этот повар ie и при этом выполнить действие [Authorized] без необходимости входа в систему. Я полностью выхожу из системы только при запуске метода SignOut.

Что это за дополнительный слой к повару ie, который держит меня в системе? Этот слой даже истекает, если я не выйду явно? Почему мне не нужно снова входить в систему для запуска [Authorized] действий, если я удаляю cook ie?

Некоторые действия HomeController:

//I made Login an [Authorized] action. When I press the button to run this action it takes me to the 
//login page and I can log in that way.
[Authorize]
public IActionResult Login()
{
    return RedirectToAction("Index", "Home");
}

//Secret action only accessible by authorized users. The Secret view displays data about user.
[Authorize]
public IActionResult Secret()
{
    Person person = new Person();
    person.NameIdentifier = User.FindFirst(ClaimTypes.NameIdentifier).Value;
    person.Email = User.FindFirst(ClaimTypes.Email).Value;

    person.GivenName = User.FindFirst(ClaimTypes.GivenName).Value;
    return View(person);
}

//Logout action runs the SignOut method and returns the SignOutResult. From my understanding,
//that's the way I log out.
[AllowAnonymous]
public IActionResult Logout()
{
    return SignOut(
        new AuthenticationProperties
        {
            RedirectUri = "https://dev-app01:8081/"
        },
        CookieAuthenticationDefaults.AuthenticationScheme,
        WsFederationDefaults.AuthenticationScheme);
}

Startup.cs> ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
    })
    .AddWsFederation(options =>
    {
        options.Wtrealm = Configuration["wsfed:realm"];
        options.MetadataAddress = Configuration["wsfed:metadata"];
    })
    .AddCookie(options =>
    {
        //I can delete this cookie and still run an [Authorized] action without loggin in again.
        options.Cookie.Name = "TestAuthCookie";
    });

    services.AddControllersWithViews();
}
...