Ключ недействителен для использования в указанном состоянии Ошибка для приложения .Net 4.5 MVC 4

В качестве предисловия к этому вопросу, пожалуйста, извините меня, если я неправильно понимаю какую-либо терминологию. Технология для меня очень нова.

У меня есть веб-сайт в MVC 4, .Net 4.5, построенный с VS 2012, размещенный на IIS7, и я использовал мастер «Идентификация и доступ» для настройки аутентификации с использованием поставщика бизнес-идентификации. Я ввел путь к документу метаданных STS, подобный следующему:

https://xyz.mycompany.com/app/FederationMetadata/2007-06/FederationMetadata.xml

В настоящее время сайт размещен в трех разных сферах. Первый - это моя локальная среда разработки, второй - стандартное интеграционное тестирование, а третий - разработка.

http://localhost/myapp
http://sit.mycompanytest.com/myapp
http://dev.mycompanytest.com/myapp

Важно отметить, что поддомен «dev» находится в веб-ферме, с балансировкой нагрузки или чем-то в этом роде. В настоящее время я не знаю точных деталей архитектуры балансировки нагрузки.

Когда я перехожу на любой из вышеуказанных сайтов с помощью IE 10, я перенаправляюсь на экран входа в систему, где я ввожу свои учетные данные и получаю доступ к данному сайту.

Но в субдомене "dev" при навигации по сайту с использованием ссылок и отправки форм я в конечном итоге получаю следующую ошибку:

Key not valid for use in specified state.

Трассировка стека ошибки:

[CryptographicException: Key not valid for use in specified state.]
System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) +397
System.IdentityModel.ProtectedDataCookieTransform.Decode(Byte[] encoded) +90

[InvalidOperationException: ID1073: A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API (see inner exception for details). If you are using IIS 7.5, this could be due to the loadUserProfile setting on the Application Pool being set to false. ]
System.IdentityModel.ProtectedDataCookieTransform.Decode(Byte[] encoded) +1158198
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +173
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver) +756
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) +100
System.IdentityModel.Services.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) +668
System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +164
System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +173
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +165

Я подозреваю, что ошибка возникает, когда балансировщик нагрузки меняет серверы.

И мы рассматривали второе обходное решение со следующего веб-сайта: (http://blogs.msdn.com/b/distributedservices/archive/2012/10/29/wif-1-0-id1073-a-cryptographicexception-Произошло-при-попытке-расшифровать-cookie-using-the-protecteddata-api.aspx). Но на веб-сайте указано, что решение предназначено для .Net 4.0.

Будет ли это решение работать для .Net 4.5? А если нет, как исправить ошибку?


person ADH    schedule 11.10.2013    source источник


Ответы (3)


Мне удалось исправить ошибку, следуя инструкциям в следующем сообщении Витторио Берточчи:

http://www.cloudidentity.com/blog/2013/01/28/running-wif-based-apps-in-windows-azure-web-sites-4/

По сути, мне пришлось включить файлы cookie веб-фермы с помощью инструмента идентификации и доступа.

В VS 2012 щелкните проект правой кнопкой мыши> выберите Identity Access> выберите вкладку Конфигурация> установите флажок Включить файлы cookie, готовые для веб-фермы> нажмите ОК.

person ADH    schedule 05.11.2013

ИМХО проблема в балансировке нагрузки. Вы должны убедиться, что ферма использует один и тот же машинный ключ. Это можно сделать на уровне компьютера или в файле web.config вашего приложения.

person Willy Van den Driessche    schedule 11.10.2013
comment
Благодарю за ваш ответ. Я считаю, что подтвердил, что у обеих машин один и тот же ключ. Я использовал оснастку сертификата MMC, и у них одинаковые даты начала и окончания срока действия. Что еще мне нужно сделать, чтобы убедиться, что это один и тот же ключ? Кроме того, каждый ключ имеет права для СЕТЕВОЙ СЛУЖБЫ и IIS_IUSR. - person ADH; 11.10.2013

Удаление FedAuth файлов cookie может сработать. Когда возникает исключение, попробуйте это в Application_Error методе Global.asax файла:

Microsoft.IdentityModel.Web.FederatedAuthentication.SessionAuthenticationModule.SignOut();
person shellBlazer    schedule 23.06.2015