У меня есть сайт, который является полагающейся стороной нашего пользовательского STS на основе WIF. Недавно мы реализовали кеш маркера безопасности, как описано здесь: Azure/web-farm ready SecurityTokenCache. Основное различие между нашей реализацией и тем, что описано в этой ссылке, заключается в том, что мы используем Azure AppFabric Caching в качестве хранилища резервных копий для долговременного кеша, а не для хранения таблиц. Это помогло нам избавить нас от проблемы усечения токенов в некоторых браузерах, но ввела новую проблему (мы видим проблему усечения в первую очередь на страницах, которые содержат cookie Google Analytics + antiforgery cookie в дополнение к cookie fedauth). Мы получаем следующее исключение несколько тысяч раз в день:
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);