Можно ли запустить WIF без LoadUserProfile = True - PullRequest
12 голосов
/ 28 марта 2011

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

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

100 ** Есть ли что-нибудь вокруг этого?

Ответы [ 2 ]

19 голосов
/ 29 марта 2011

Да, это потому, что вы используете шифрование токена по умолчанию, основанное на DPAPI. Вы можете заменить это шифрованием на основе сертификата. См. Здесь: 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;
}

Оба на глобальном.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;
}
5 голосов
/ 18 июля 2013

Вы также можете использовать 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>
...