Как правильно установить время ожидания при федерации с ADFS 2.0

Я использую ADFS 2.0 уже довольно давно, и я понимаю, как все работает. Я сделал дюжину пользовательских RP, пользовательских STS, а также использовал ADFS в качестве проверяющей STS.

Однако у меня есть простое требование, которое я все еще не могу выполнить.

Я хочу, чтобы мои пользователи были вынуждены повторно регистрироваться через некоторое фиксированное время. Скажем, 1 минута, в целях тестирования.

Во-первых, я сделал некоторые исправления на стороне RP. Кажется, что по неизвестной причине RP сохраняет сеанс, даже если токен validTo указывает назад во времени. Это противоречит тому, что Витторио Берточчи говорит в своей книге (стр. 123), где он показывает, как выполнить скользящее истечение срока действия - он говорит, что "SessionAuthenticationModule позаботится об обработке истекшего сеанса сразу после". Ну, для меня это не так, однако я нашел здесь трюк http://blogs.planbsoftware.co.nz/?p=521 - взгляните на предложение "если":

        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, чтобы запрос на обновление токена был защищен страницей входа в систему.

Заранее спасибо.

редактировать

Я могу подтвердить, что установка всех указанных выше параметров на 1 минуту делает сеанс ADFS недействительным через 5 минут (или более). Это ужасно, и кажется, что я либо делаю основную ошибку, либо 5 минут - это минимально допустимое значение.

Мой (2) сверху теперь только для того, чтобы подтвердить и объяснить мои наблюдения.

3 ответа

Решение

Согласно комментариям выше (совместные усилия с ФП) Freshness собственность на FederatedPassiveSignIn экземпляр должен быть установлен в 0.

Согласно http://docs.oasis-open.org/wsfed/federation/v1.2/ws-federation.html это указывает на то, что IP/STS повторно запрашивает у пользователя аутентификацию, прежде чем он выдаст токен.

Вы также можете попробовать изменить ADFS с встроенной проверки подлинности Windows на проверку подлинности на основе форм. Вероятно, вам все равно придется использовать свойство свежести, но теперь вашим пользователям придется вводить свои учетные данные, даже если они находятся в той же сети, что и ваша AD.

Эта статья объясняет это довольно просто:

http://social.technet.microsoft.com/wiki/contents/articles/1600.aspx

Довольно странно, что установка значения TokenLifetime не сработала. Статья в MSDN объясняет тайм-аут как прямую настройку - назначая значение TokenLifetime. Мне интересно узнать, правильна ли настройка, описанная в MSDN. Если это не помогло, то пришло время пересмотреть эту статью. Надеюсь, что это будет большой помощью для тех, кто сталкивается с этой проблемой.

Другие вопросы по тегам