我正在開發自己的聯合實施。有兩個RP。 RP之間的SSO不起作用(錯誤地)。我懷疑它與STS創建的cookie有關。 STS爲自己寫了一個fedauth cookie。根據我的理解,它應該寫一個表單身份驗證cookie?自定義STS SSO失敗
當從另一個RP第二次點擊STS時,我可以在ClaimsPrincipal中看到IsAuthenticated = True,但提示用戶登錄並且不會自動重定向回RP。
值得注意的是,SSO之前的工作,自動重定向和所有,但負載平衡器上的RP無法共享cookie,因爲它使用機器密鑰(並且沒有粘性會話)。我通過實現一個使用證書的自定義SessionSecurityTokenHandler來解決這個問題(下面的代碼)。正是在這一點上,STS開始編寫FedAuth cookies並且SSO開始失敗。
STS的令牌正被寫入:
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);
標記處理程序:
var sessionTransforms = new List<CookieTransform>(new CookieTransform[]
{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(federationConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(federationConfiguration.ServiceCertificate)
});
var sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());
federationConfiguration.IdentityConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
使用機器密鑰不是必需的,我們在所有機器上使用相同的證書。 每個RP都寫自己的cookie。這很好。我的問題是:STS應該爲自己寫一個FedAuth cookie嗎?並且:爲什麼當從其他RP再次擊中STS時不會自動登錄? (是否正確指定了聽衆uris) – Swifty
如果我知道您正在使用哪個STS,這將有所幫助。通常,當您登錄時,STS會在其自己的域中寫入cookie。這個cookie確保你有下一個RP的單點登錄。這可能是正常情況下的會話cookie,「記住我」情況下的永久性cookie。 RP可以自由地做他們想做的事。一般來說,他們會通過在自己的域中寫入會話安全令牌來響應安全令牌。當下一個RP進入STS時,STS將爲RP發送一個安全令牌,而不顯示任何UI。最後的行爲取決於STS。 –
只需添加一件事:通常,在依賴方之間共享會話安全令牌Cookie並不是一個好主意。 –