2012-12-19 19 views
9

Używam usługi Azure ACS dla Windows Live i Google i działam bez żadnych problemów. Ostatniej nocy przeskalowaliśmy instancje z 1 działającej instancji do 3 i od tego czasu użytkownicy zgłaszali problemy podczas uzyskiwania dostępu do naszej witryny. Wyśledziliśmy to na podstawie następującego wyjątku, który występuje dość regularnie.Ochrona API Wyjątki podczas skalowania ról sieci Azure przy użyciu ACS

Zakładamy, że mamy problem gdzieś w naszej konfiguracji, ale nie jesteśmy pewni, czego nam brakuje. Ustawiliśmy klucz maszyny ...

<machineKey decryption="AES" decryptionKey="F7_SOMETHING_SOMETHING_FA" validation="SHA1" validationKey="63_SOMETHING_SOMETHING_BF" /> 

Czy ktoś może rzucić trochę światła na ten problem?

System.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.Security.Cryptography.CryptographicException: 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) 
    --- End of inner exception stack trace --- 
    at Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) 
    at Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) 
    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) 

Uwaga: W kontekście. działa on w roli sieciowej Windows Azure i jest to MVC 4.

Odpowiedz

7

Skalowanie zostało przerwane, a ponieważ aplikacja jest hostowana za modułem równoważenia obciążenia, możliwe jest, że użytkownik przeszedł na serwer A, plik cookie sesji jest chroniony przez DPAPI na serwerze A, ale ponieważ nadal przegląda witrynę, moduł równoważenia obciążenia przekierowuje żądanie do wykonania na serwerze B. Gdy tak się dzieje, serwer B nie ma pasującego klucza komputera, więc nie jest w stanie do odszyfrowania pliku cookie sesji i zgłasza powyższy błąd. Oto trzy sposoby rozwiązania tego problemu.

Windows Identity Foundation (WIF) to pozornie działające środowisko uruchomieniowe, które musi być zainstalowane na komputerze, aby aplikacja wykorzystująca oświadczenia mogła z niego korzystać. WIF nie jest domyślnie instalowany w instancjach Windows Azure. Aby uruchomić aplikację obsługującą oświadczenia w chmurze, musisz udostępnić środowisko wykonawcze WIF w instancji Windows Azure. Najłatwiej jest to zrobić, dołączając zestaw WIF do pakietu wdrożeniowego.

Aby dołączyć zespół WIF z pakietu wdrażania Windows Azure

  1. W Solution Explorer zlokalizować aplikacji obsługującej oświadczenia.
  2. Rozwiń folder Referencje.
  3. Zlokalizuj zespół Microsoft.IdentityModel w folderze Referencje.
  4. Kliknij prawym przyciskiem myszy zespół, a następnie kliknij polecenie Właściwości.
  5. W oknie właściwości, określ Kopiuj lokalnie jako Prawdziwe i Określoną wersję jako False.

Domyślnie WIF chroni pliki cookie w sposób kryptograficzny za pomocą interfejsów programowania aplikacji do ochrony danych (DPAPI). Interfejs DPAPI nie jest dostępny w systemie Windows Azure. Aby upewnić się, że aplikacja internetowa obsługująca oświadczenia w chmurze działa poprawnie po wdrożeniu w systemie Windows Azure, musisz dodać funkcję szyfrowania plików cookie przy użyciu RSA.

Aby zaszyfrować pliki cookie używając RSA

  1. W Solution Explorer, znajdź swój cloud oświadczenia aplikację internetową.
  2. Otwórz plik global.asax.cs, który jest kodem znajdującym się za plikiem global.asax w edytorze Visual Studio.

Dodaj następujące deklaracje:

using Microsoft.IdentityModel.Tokens; 
using Microsoft.IdentityModel.Web; 
using Microsoft.IdentityModel.Web.Configuration; 

Dodaj następujący kod:

void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e) 
{ 
    // 
    // Use the <serviceCertificate> to protect the cookies that are 
    // sent to the client. 
    // 
    List<CookieTransform> sessionTransforms = 
     new List<CookieTransform>(new CookieTransform[] { 
     new DeflateCookieTransform(), 
     new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate), 
     new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate) }); 
    SessionSecurityTokenHandler sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly()); 
    e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler); 
} 

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

Więcej informacji można znaleźć tutaj: http://msdn.microsoft.com/en-us/library/hh289318.aspx

2

Jest to powszechne wyjątek przy użyciu WIF w farm środowisko. Chodzi o to, że domyślnym zachowaniem jest użycie DPAPI do szyfrowania pliku cookie. Jednak DPAPI jest związany z MachineKey.

Trzeba dokonać niewielkiej zmiany w pliku Global.Asax i skorzystać z dostawcy usług Crypto RSA w celu zaszyfrowania/odszyfrowania pliku cookie FedAuth. Spójrz na this article on how to achieve that.

1

Wpadłem na podobny problem, próbując wykorzystać ACS z aplikacją MVC 4 wdrożoną jako instancja witryny Windows Azure kontra usługa w chmurze. Poniższe pomogły mi rozwiązać problem. http://msdn.microsoft.com/en-us/library/hh568644.aspx

przewijania do samego dna i znaleźć Przykładem, który przedstawia usuwanie SessionSecurityTokenHandler i zastąpienie go MachineKeySessionSecurityTokenHandler.

Powiązane problemy