Подтвердить что ты не робот

Возможно ли запустить WIF без LoadUserProfile = True

Я пытаюсь запустить приложение WIF Relying Party на общем хосте. Они не устанавливают значение IIS для параметра LoadUserProfile равным true, и поэтому я получаю следующую ошибку:

Сообщение: операция защиты данных не удалась. Это может быть вызвано отсутствием загрузки профиля пользователя для текущего контекста пользователя потока, который может иметь место, когда поток олицетворяет собой. ExceptionStackTrace: в System.Security.Cryptography.ProtectedData.Protect(Byte [] userData, Byte [] optionalEntropy, область DataProtectionScope) в Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Encode(значение байта [])

В любом случае?

4b9b3361

Ответ 1

Да, это потому, что вы используете стандартное шифрование токена, которое зависит от DPAPI. Вы можете заменить это с помощью шифрования на основе certficate. См. Здесь: http://msdn.microsoft.com/en-us/library/ff803371.aspx (прокрутите до "Есть еще одно изменение в приложении..." )

Код:

void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
    var sessionTransforms =
        new List<CookieTransform>(
            new CookieTransform[] 
            {
                new DeflateCookieTransform(), 
                new RsaEncryptionCookieTransform(
                    e.ServiceConfiguration.ServiceCertificate),
                new RsaSignatureCookieTransform(
                    e.ServiceConfiguration.ServiceCertificate)  
            });
    var readOnlyTransforms = sessionTransforms.AsReadOnly();
    var sessionHandler = new SessionSecurityTokenHandler(readOnlyTransforms);

    e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}

и

void Application_Start(object sender, EventArgs e)
{
    FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}

Оба на global.asax.cs

Кстати, это также "удобный для веб-фермы" способ настройки WIF, поэтому он является независимым от машины (экземпляра). Развертывание Windows Azure - это, по сути, веб-фермы, поэтому вы видите это в этой главе.

Обновление. В новых версиях API изменился. Обновленный код будет выглядеть следующим образом:

void OnFederationConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
{
    var sessionTransforms = new List<CookieTransform>(
        new CookieTransform[]
            {
                new DeflateCookieTransform(),
                new RsaEncryptionCookieTransform(e.FederationConfiguration.ServiceCertificate),
                new RsaSignatureCookieTransform(e.FederationConfiguration.ServiceCertificate)
            });
    var sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());

    e.FederationConfiguration
        .IdentityConfiguration
        .SecurityTokenHandlers
        .AddOrReplace(sessionHandler);
}

и

protected void Application_Start()
{
    FederatedAuthentication.FederationConfigurationCreated += OnFederationConfigurationCreated;
}

Ответ 2

Вы также можете использовать MachineKeySessionSecurityTokenHandler, который доступен в .net 4.5 в пространстве имен System.IdentityModel.Services.Tokens. Вы можете включить этот обработчик маркера, установив его в конфигурации.

<system.identityModel>
  <identityConfiguration>

    <securityTokenHandlers>
      <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler,
                    System.IdentityModel, Version=4.0.0.0, Culture=neutral,
                    PublicKeyToken=B77A5C561934E089" />

      <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler,
              System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral,
              PublicKeyToken=B77A5C561934E089">        
      </add>
    </securityTokenHandlers>

  </identityConfiguration>
</system.identityModel>