2016-07-18 119 views
0

我正在開發自己的聯合實施。有兩個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); 

回答

0

的STS寫入自身的Cookie。它將安全令牌發佈到您的應用程序。您的應用程序通常會通過編寫一個會話身份驗證cookie進行響應,該cookie將在其過期之前使用(然後它會返回到STS)

如果您在Web場中工作,那麼可以使用現成的這使用WIF配置:

當然,Web場中的機器應共享相同的機器密鑰。你當然可以使用你自己的機制,但很少有意義。

接下來,每個RP都應該編寫自己的「會話」cookie來證明您的身份驗證。如果兩個RP位於同一個域中,那麼他們應該使用不同的cookie名稱。

+0

使用機器密鑰不是必需的,我們在所有機器上使用相同的證書。 每個RP都寫自己的cookie。這很好。我的問題是:STS應該爲自己寫一個FedAuth cookie嗎?並且:爲什麼當從其他RP再次擊中STS時不會自動登錄? (是否正確指定了聽衆uris) – Swifty

+0

如果我知道您正在使用哪個STS,這將有所幫助。通常,當您登錄時,STS會在其自己的域中寫入cookie。這個cookie確保你有下一個RP的單點登錄。這可能是正常情況下的會話cookie,「記住我」情況下的永久性cookie。 RP可以自由地做他們想做的事。一般來說,他們會通過在自己的域中寫入會話安全令牌來響應安全令牌。當下一個RP進入STS時,STS將爲RP發送一個安全令牌,而不顯示任何UI。最後的行爲取決於STS。 –

+0

只需添加一件事:通常,在依賴方之間共享會話安全令牌Cookie並不是一個好主意。 –