Я давно пользуюсь ADFS 2.0 и понимаю, как все работает. Я сделал дюжину пользовательских RP, пользовательских STS, а также использовал ADFS в качестве проверяющей STS.
Однако у меня есть простое требование, которое я все еще не могу выполнить.
Я хочу, чтобы мои пользователи были вынуждены relogin через некоторое фиксированное время. Скажем, 1 минута для целей тестирования.
Во-первых, я сделал некоторые исправления на стороне RP. Кажется, что по неизвестной причине RP сохраняет сеанс, даже если токен validTo
указывает назад во времени. Это противоречит тому, что Витторио Берточчи говорит в своей книге (стр. 123), где он показывает, как выполнить скользящее истечение срока действия - он говорит, что «SessionAuthenticationModule позаботится об обработке сеанса с истекшим сроком действия сразу после». Ну, для меня это не так, однако я нашел здесь трюк http://blogs.planbsoftware.co.nz/?p=521 - взгляните на предложение "if":
sam.SessionSecurityTokenReceived +=
( s, e ) =>
{
SessionAuthenticationModule _sam = s as SessionAuthenticationModule;
DateTime now = DateTime.UtcNow;
DateTime validFrom = e.SessionToken.ValidFrom;
DateTime validTo = e.SessionToken.ValidTo;
try
{
double halfSpan = ( validTo - validFrom ).TotalSeconds / 2;
if ( validTo < now )
{
_sam.DeleteSessionTokenCookie();
e.Cancel = true;
}
}
catch ( Exception ex )
{
int v = 0;
}
};
Этот трюк исправляет проблему на стороне RP. Если токен недействителен, приложение очищает его и перенаправляет на страницу входа.
Теперь приходит проблема. Моя страница входа использует элемент управления FederatedPassiveSignIn
. При нажатии он перенаправляет браузер в ADFS.
Но ADFS успешно создает новый сеанс без запроса пользователя.
Я установил время жизни токена для этого RP на 1:
Set-ADFSRelyingPartyTrust -Targetname "myrpname" -TokenLifetime 1
и используя Get-ADFSRelyingPartyTrust
я вижу, что он установлен в 1 (я даже печатаю токен validTo
на своей странице, чтобы убедиться, что он установлен правильно).
Затем я устанавливаю свойства ADFS с помощью ADFS-SetProperties
:
ADFS-SetProperties -SsoLifetime 1
ADFS-SetProperties -ReplyCacheExpirationInterval 1
ADFS-SetProperties -SamlMessageDeliveryWindow 1
но все равно не повезло. Я застрял сейчас.
Сценарий корректно работает с моей пользовательской службой STS, где действительность сеанса STS основана на файле cookie форм - если я установил тайм-аут для файлов cookie службы STS на 1, после 1 минуты бездействия в моем приложении RP я перенаправляюсь на страница входа в мой RP, которая затем перенаправляет на STS, которая представляет свою страницу входа.
Однако в случае ADFS 2.0 это не так. После минуты бездействия я перенаправлен на страницу входа в мой RP, которая перенаправляет на страницу входа ADFS, которая, в свою очередь, перенаправляется обратно, как сеанс все еще активен в ADFS.
Я бы хотел, чтобы кто-то:
(1) взгляните на взлом, описанный сверху, и объясните, почему токен с истекшим сроком не отклоняется автоматически, и такой уродливый взлом необходим
(2) объясните, как правильно установить время ожидания сеанса на стороне ADFS 2.0, чтобы запрос на обновление токена был защищен страницей входа в систему.
Заранее спасибо.
1050 * редактировать *
Я могу подтвердить, что установка всех указанных выше параметров на 1 минуту делает сеанс ADFS недействительным через 5 минут (или более). Это ужасно, и кажется, что я либо совершаю основную ошибку, либо 5 минут - минимально допустимое значение.
Мои (2) сверху теперь предназначены только для подтверждения и объяснения моего наблюдения.