2012-02-03 197 views
9

我正在使用ADFS 2.0很長一段時間,並且我理解事情的工作方式。我做了很多自定義RP,自定義STS以及使用ADFS作爲依賴STS。如何正確設置聯合ADFS 2.0時的超時時間

但是,我有一個簡單的要求,我仍然無法實現。

我希望我的用戶在經過一段固定的時間後被迫登陸relogin。假設1分鐘,用於測試目的。

首先,我在RP方面做了一些更正。看起來不明原因,即使令牌的時間點回到原點,RP也會保留該會話。這與Vittorio Bertocci在他的書(第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-SetProperties ADFS屬性:

ADFS-SetProperties -SsoLifetime 1 
ADFS-SetProperties -ReplyCacheExpirationInterval 1 
ADFS-SetProperties -SamlMessageDeliveryWindow 1 

但仍沒有運氣。我現在卡住了。

我的自定義STS的STS會話的有效性基於Forms cookie - 如果我將STS的窗體cookie超時設置爲1,我的RP應用程序中的非活動狀態1分鐘後,我的RP的登錄頁面然後重定向到呈現其登錄頁面的STS。

但是,ADFS 2.0並非如此。經過一段時間的不活動後,我被重定向到我的RP的登錄頁面,該頁面重定向到ADFS的登錄頁面,然後將其重新引導回來,就像會話在ADFS中仍處於活動狀態一樣。

我想有人:

(1)看看上方描述的黑客,並解釋爲什麼過期的令牌不會自動拒絕,需要這樣醜陋的黑客

(2)解釋如何在ADFS 2.0端正確地超時會話,以便更新令牌的請求通過登錄頁面進行保護。

在此先感謝。

編輯

我可以證實,所有上述參數設定爲1分鐘,使ADFS會話5分鐘(或更多)後無效。這很平穩,似乎我犯了一個基本的錯誤,或者5分鐘是最低可接受的價值。

我上面的(2)現在只是爲了確認和解釋我的觀察。

+0

從我的POV中,您提供的信息不足以提供幫助(儘管您提供了很多信息),因爲超時行爲取決於很多不同部分(STS,RP ...)的設置以及這些部分的實現方式。 ..因爲你使用了大量的自定義組件,所以必須大量推測:-( – Yahia 2012-02-05 19:34:07

+0

@Yahia:感謝你的興趣,你會發現,這裏沒有自定義組件,它是ADFS 2.0,開箱即用,使用WIF在我看來,沒有任何猜測的空間 – 2012-02-05 20:22:06

+0

然後我認爲從*我已經完成了一打自定義RP,自定義STS以及錯誤地使用ADFS作爲依賴STS * – Yahia 2012-02-05 20:29:51

回答

8

按照上述(與OP共同努力)上FederatedPassiveSignIn實例Freshness屬性應該被設置爲0。

根據http://docs.oasis-open.org/wsfed/federation/v1.2/ws-federation.html這個註釋指示用於IP/STS重新提示認證的用戶在它發佈令牌之前。

+0

再次感謝。我已經接受了答案,並將其獎勵給我。 – 2012-02-07 08:56:11

+0

歡迎您:-)根據[MSDN](http://msdn.microsoft.com/en-us/library/ff650503.aspx)的行爲似乎是設計 - 報價:*爲了確保積極的用戶體驗,用戶只有在登錄到工作站時才需要輸入用戶名和密碼;用戶在訪問多個客戶端時不必多次重複輸入它們* – Yahia 2012-02-07 09:00:16

+0

這就是爲什麼我需要使用'TokenLifeTime'和'SsoLifeTime'參數進行更多實驗的原因。將它們設置爲1可能會導致我觀察到的錯誤行爲,但將它們設置爲例如20分鐘將使其行爲正確。我只是希望如此。 – 2012-02-07 09:03:30

1

您也可以嘗試將Windows集成身份驗證中的ADFS更改爲基於表單的身份驗證。您可能仍然需要使用新鮮財產,但現在用戶將不得不輸入他們的憑證,即使他們與您的AD位於同一網絡。

本文介紹了它相當簡單:

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

+0

感謝您的評論。我沒有明確說明,但我們的ADFS總是設置爲表單身份驗證。 – 2012-08-31 20:38:29

0

這是相當奇怪的是,設置TokenLifetime值沒有工作。 article in MSDN將超時解釋爲一個簡單的設置 - 通過分配TokenLifetime值。我很想知道MSDN中描述的設置是否正確。如果這沒有幫助,那麼現在是修改該文章的正確時機。希望對那些面臨這個問題的人們有很大的幫助。

+1

謝謝你,即使問題有點老。從我記憶中,設置TokenLifetime 1分鐘不是一個好主意,但我還記得,高於5分鐘的值正常工作。 – 2013-02-04 07:16:08

+0

感謝您的及時回覆。當然這是一個有用的提示。我會試一試並確認是否有任何差異。 – Karthik 2013-02-04 22:50:02