我正在使用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)現在只是爲了確認和解釋我的觀察。
從我的POV中,您提供的信息不足以提供幫助(儘管您提供了很多信息),因爲超時行爲取決於很多不同部分(STS,RP ...)的設置以及這些部分的實現方式。 ..因爲你使用了大量的自定義組件,所以必須大量推測:-( – Yahia 2012-02-05 19:34:07
@Yahia:感謝你的興趣,你會發現,這裏沒有自定義組件,它是ADFS 2.0,開箱即用,使用WIF在我看來,沒有任何猜測的空間 – 2012-02-05 20:22:06
然後我認爲從*我已經完成了一打自定義RP,自定義STS以及錯誤地使用ADFS作爲依賴STS * – Yahia 2012-02-05 20:29:51