Microsoft.IdentityModel: ключ недействителен для использования в указанном состоянии - PullRequest
11 голосов
/ 22 ноября 2011

У меня есть веб-приложение с поддержкой утверждений, использующее Windows Identity Foundation, которое работает хорошо, за исключением одного сервера.Я вижу сообщение об ошибке, показанное ниже в журнале событий.

Exception information: 
    Exception type: CryptographicException 
    Exception message: Key not valid for use in specified state.

   at System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope)
   at Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded)

Это приложение использует очень стандартную реализацию WIF с ADFS v2.Он не использует RsaEncryptionCookieTransform.Я ищу любые предложения о том, как диагностировать это.То, что я пробовал до сих пор:

  1. Пул приложений использует удостоверение ASP.NET v4.0, для которого для параметра «Загрузить профиль пользователя» установлено значение true.
  2. Я удалил папку C: \ Users \ ASP.NET v4.0 \ AppData и увидел, что она была успешно воссоздана.
  3. Я проверил разрешения для закрытых ключей сертификатов, которые были хорошими.Я также попытался отключить токен-шифрование, которое не имело никакого значения.

Буду признателен за любой совет.

Ответы [ 7 ]

15 голосов
/ 22 ноября 2011

Обычно это вызвано тем, что приложение не может расшифровать cookie-файл токена аутентификации.Убедитесь, что удостоверение, которому принадлежит пул приложений, имеет достаточные разрешения для доступа к вашему хранилищу сертификатов.Попробуйте изменить Identity на NetworkService и посмотрите, поможет ли это.

Вы также должны очистить файлы cookie вашего браузера, чтобы убедиться, что у вас нет файлов cookie из другого приложения.

7 голосов
/ 11 апреля 2012

Проблема воспроизводится на 100%:

Действительно, после повторного развертывания приложения И старый файл cookie аутентификации остается на клиентском компьютере (клиент не вышел) - эта ошибка появляется на клиенте прилюбой следующий запрос.Чтобы исправить эту ошибку, клиент должен удалить куки и / или войти, а затем выйти из STS.Как только все сделано - ошибка исчезает и все в порядке до следующего обновления ....

После некоторого исследования, я думаю, что это ошибка в модуле SessionAuthenticationModule, которую необходимо исправить.Если вы внимательно посмотрите на приведенную выше трассировку стека, есть интересный метод под названием TryReadSessionTokenFromCookie, который устанавливает ожидание того, что модуль аутентификации будет «пытаться» прочитать токен из cookie, и вернет false, если это не получится, - вот код (благодаряResharper!):

public bool TryReadSessionTokenFromCookie(out SessionSecurityToken sessionToken)
{
    byte[] sessionCookie = this.CookieHandler.Read();
    if (sessionCookie == null)
    {
        sessionToken = null;
        return false;
    }
    sessionToken = this.ReadSessionTokenFromCookie(sessionCookie);
    if (DiagnosticUtil.TraceUtil.ShouldTrace(TraceEventType.Verbose))
    {
        DiagnosticUtil.TraceUtil.Trace(TraceEventType.Verbose, TraceCode.Diagnostics, SR.GetString("TraceValidateToken", new object[0]), new TokenTraceRecord(sessionToken), null);
    }
    return true;
}

Очевидно, что в этом методе происходит сбой кода с необработанной ошибкой, и у разработчика не остается никакой возможности обработать ошибку более или менее разумным способом.(... Или, по крайней мере, я не смог найти ни одного, поскольку этот модуль HTTP не передает эту ошибку объекту HttpApplication для обработки и выбрасывает ее в лицо пользователя.) Итак, я думаю, что есть две ошибки: 1) Маркер безопасностиобработчик должен быть более конкретным в отношении причины выброса ID1073 (ошибка расшифровки на стороне сервера или неправильная (старая) ошибка cookie) 2) Должен быть способ для разработчика обработать эту ошибку и выйти из системы пользователя, если это происходит,Я приму ЛЮБУЮ помощь по этому вопросу ... Может ли кто-нибудь, ПОЖАЛУЙСТА, создать пример кода, показывающий, как перехватить это исключение, чтобы пользователь мог автоматически выйти из системы при возникновении этой ошибки?Опять же, событие Application.Error, похоже, не запускается из этого модуля - не уверен, что еще можно сделать для его обработки, кроме написания моего собственного SessionAuthenticationModule.ЛЮБАЯ ПОМОЩЬ ВЫСОКО ЦЕНИТСЯ!!!Спасибо!Alex

3 голосов
/ 26 января 2016

Я разрешаю свой случай, потому что у меня одно и то же имя cookie "FedAuth" для двух приложений (это имя по умолчанию). Просто введите другое имя, и оно решается:

<system.identityModel.services>
<federationConfiguration>
  <cookieHandler name="ACookieName" />
</federationConfiguration>

2 голосов
/ 03 марта 2016

У меня сработало следующее:

Вам необходимо добавить раздел в system.identityModel / identityConfiguration

Ссылка: SessionSecurityTokenHandler пытается расшифровать SessionSecurityToken в зашифрованном RSA cookie с использованием DPAPI; почему?

  <system.identityModel>
    <identityConfiguration saveBootstrapContext="true">
      <audienceUris>
        <add value="yoursite.com" />
      </audienceUris>
      <issuerNameRegistry type="Thinktecture.IdentityModel.Tokens.MetadataBasedIssuerNameRegistry, Thinktecture.IdentityModel">
        <trustedIssuerMetadata issuerName="urn:federation:company:stage" metadataAddress="https://federation-sts-stage.company.com/FederationMetadata/2007-06/FederationMetadata.xml"></trustedIssuerMetadata>
      </issuerNameRegistry>
      <certificateValidation certificateValidationMode="None" />
<securityTokenHandlers>
     <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler,  
             System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, 
            System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </securityTokenHandlers>
    </identityConfiguration>
  </system.identityModel>
1 голос
/ 24 июня 2015

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

Microsoft.IdentityModel.Web.FederatedAuthentication.SessionAuthenticationModule.SignOut();
0 голосов
/ 26 сентября 2018

Эта проблема связана с недостаточным разрешением.Пул приложений должен иметь ApplicationPoolIdentity Удостоверение, чтобы оно работало.Перейдите в пул приложений -> Расширенные настройки -> Встроенные учетные записи, чтобы изменить настройки

0 голосов
/ 29 июня 2012

Эта ошибка, похоже, не обнаруживается приложением http.Пожалуйста, проверьте http://social.technet.microsoft.com/wiki/contents/articles/1898.aspx#Q1 вместо.

...