2012-03-20 186 views
11

我有一個網站是我們基於WIF的自定義STS的依賴方。我們最近實現了一個安全令牌緩存,如下所述:Azure/web-farm ready SecurityTokenCache。我們的實現和該鏈接中描述的實現之間的主要區別在於,我們使用Azure AppFabric緩存作爲持久緩存的後備存儲,而不是表存儲。這有助於緩解我們在某些瀏覽器上出現令牌截斷問題,但卻引入了一個新問題(我們看到截斷問題主要出現在除了fedauth cookie之外還包含Google Analytics(分析)+ antiforgery cookie的頁面上)。我們現在會收到以下異常數千次,每天:WIF安全令牌緩存

System.IdentityModel.Tokens.SecurityTokenException 
ID4243: Could not create a SecurityToken. A token was not found in the token cache and no cookie was found in the context. 

System.IdentityModel.Tokens.SecurityTokenException: ID4243: Could not create a  SecurityToken. A token was not found in the token cache and no cookie was found in the context. 
    at Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver) 
    at Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) 
    at Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) 
    at Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) 
    at Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) 
    at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

此異常似乎重定向循環要發生的事情,所以我們一個1-2分鐘的時間跨度內看到數百人。

在研究異常時,我一直無法找到任何有用的信息。迄今爲止唯一的希望是有人提到它可能與會話之前到期的緩存對象有關。

我們無法在內部重現問題,只知道它存在是因爲成千上萬的條目填滿了我們的Elmah表。任何幫助或見解將非常感激。

我們推出了我們認爲可能有助於解決這個問題(下面的代碼),但它沒有任何效果:

HttpContext.Current.Response.Cookies.Remove("FedAuth"); 
WSFederationAuthenticationModule authModule = FederatedAuthentication.WSFederationAuthenticationModule; 
string signoutUrl = (WSFederationAuthenticationModule.GetFederationPassiveSignOutUrl(authModule.Issuer, authModule.Realm, null)); 
Response.Redirect(signoutUrl); 

回答

0

這應該如果做令牌或的總規模索賠數量令牌太大而無法在Cookie中來回傳送。如果情況並非如此,那麼簡化您的解決方案,並使用使用cookie的默認設置。然而,你可以使用基於證書的cookie加密,所以它仍然是「農場友好的」。默認情況下,WIF將使用具有機器親和力的DPAPI進行加密。

+1

我們所實現的安全令牌緩存,因爲我們的cookies的集體棧是超過某些瀏覽器(Safari瀏覽器,Opera等)的4096個字節的域cookie大小限制。它是爲了響應cookie截斷問題而實現的。我們也已經使用基於證書的cookie加密。安全令牌緩存對我們來說是「必須的」,並且具有我們希望的效果,但是實現已經創建了這個新的例外。這個異常的真正問題是它將我們的用戶引入重定向循環。 – Jeff 2012-03-28 15:59:09

1

如果您瀏覽至新開始的應用程序,而您的瀏覽器仍然保留較早會話中的cookie,則會看到此確切錯誤。由於這些cookie是會話cookie,因此修復方法是關閉所有瀏覽器窗口並再次瀏覽到應用程序。

據我所知,我們的應用程序是一個'正常'的web應用程序,使用WIF重定向到AD FS,沒有任何特殊的安全令牌緩存。但是,我們確實使用WIF cookie的「會話模式」(請參閱​​"Your FedAuth Cookies on a Diet: IsSessionMode=true"),這會使WIF Coo​​kie變得更小。

+0

那麼,我們如何能夠重現這一點,以確定如果這是問題,我們將如何防止它發生?我會檢查,但我相信我們讓瀏覽器坐在頁面上24小時,然後刷新,看看我們是否可以得到它repro,它不會。我們是否還必須確保應用程序啓動/重新啓動?我不是100%確定你的意思是「新開始的應用程序」。 – 2012-04-02 03:47:16

1

我們目前面臨完全相同的問題,雖然我們的情況有些不同。我們正在嘗試使用WIF爲Outlook Web App(OWA)提供Shibboleth SSO。負載均衡器後面有幾臺OWA主機。

WIF生成大小超過2.5 kB的FedAuth cookie(和FedAuth1)。我們的負載均衡器會截斷cookie。所以我們在OWA的global.asax文件中設置了IsSessionMode -Property到true。現在,Cookie的大小減少到大約。 600字節,這很好。 OWA的作品。

但是,在同一臺服務器上運行的Exchange控制面板(ECP)不再有效。 ECP在同一個IIS應用程序池中運行,並在其global.asax文件中設置了IsSessiobnMode-Property。每當ECP被調用,應用程序不發回任何迴應,但WIF報道:

Current user: 'User not set' 
    Request for URL 'http://owa.ourdomain.com/ecp/' failed with the following error: 
    System.IdentityModel.Tokens.SecurityTokenException: ID4243: Could not create a SecurityToken. A token was not found in the token cache and no cookie was found in the context. 
2

引起緩存SessionSecurityToken此問題。緩存目標位於應用程序池的本地域,因此當.NET需要內存時,它將自動被清除。最好的解決方案是兩個取消緩存安全或實現您自己的子系統進行緩存。

溶液1

的AppFabric的Windows Server 的memcached - 分佈式內存對象緩存系統

解決方案2

var sessionSecurityToken = new SessionSecurityToken(principal, TimeSpan.FromHours(Convert.ToInt32(System.Web.Configuration.WebConfigurationManager.AppSettings["SessionSecurityTokenLifeTime"]))) 
{ 
    IsPersistent = false, // Make persistent 
    IsReferenceMode = true // Cache on server 
}; 
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken); 
5

我有一個MVC的單頁應用程序使用WSO2 4.5依賴方作爲IDP並得到相同的錯誤 - 「System.IdentityModel.Tokens.SecurityTokenException ID4243:無法創建SecurityToken。在令牌緩存中找不到令牌,並且沒有cookie在上下文中找到。 ...「進行搜索,並通過Thinktecture的名氣Brock Allen發現以下陳述

當瀏覽器發送包含用戶聲明的cookie但拋出某些有關處理的內容時,拋出此異常(或者密鑰已經改變,所以令牌無法驗證,或者如果使用服務器端緩存並且緩存爲空),最終用戶無法做到這一點,他們打算。繼續得到錯誤,因爲瀏覽器將繼續發送的cookie

爲文章全文:http://brockallen.com/2012/10/22/dealing-with-session-token-exceptions-with-wif-in-asp-net/

在同一篇文章中,他提供了下面的代碼片段來解決我的問題。在Global.asax中:

void Application_OnError() 
{ 
    var ex = Context.Error; 
    if (ex is SecurityTokenException) 
    { 
     Context.ClearError(); 
     if (FederatedAuthentication.SessionAuthenticationModule != null) 
     { 
      FederatedAuthentication.SessionAuthenticationModule.SignOut(); 
     } 
     Response.Redirect("~/"); 
    } 
}