Как правильно установить время ожидания при федерации с ADFS 2.0 - PullRequest
9 голосов
/ 03 февраля 2012

Я давно пользуюсь 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) сверху теперь предназначены только для подтверждения и объяснения моего наблюдения.

Ответы [ 3 ]

8 голосов
/ 07 февраля 2012

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

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

1 голос
/ 01 сентября 2012

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

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

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

0 голосов
/ 04 февраля 2013

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

...