Я использую 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);
}