2012-12-19 8 views
9

Windows LiveとGoogleに対してAzure ACSを使用しており、問題なく実行されています。昨夜、1つの実行インスタンスから3つのインスタンスにスケールアップして以来、人々はサイトにアクセスする際に問題を報告しています。私たちはこれを、かなり定期的に発生している以下の例外をトレースしました。ACSを使用してAzure Webロールをスケーリングする際の保護APIの例外

私たちは設定のどこかに問題があると想定していますが、欠落しているものについてはわかりません。マシンキーを設定しました...

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

誰でもこの問題を解消できますか?

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) 

注:コンテキストのために。これはWindows Azure Webロールで実行され、MVC 4です。

答えて

7

アプリケーションがロードバランサの背後にホストされているので、スケールされているので、ユーザーはサーバーAにナビゲートしている可能性があります。サーバーAのDPAPIによって保護されたセッションCookieを取得しましたが、サイトをブラウズし続けると、ロードバランサはサーバーBの実行要求をリダイレクトします。この場合、サーバーBには一致するマシンキーがないためセッションCookieを復号化し、上記のエラーをスローします。この問題を解決できる方法は3つあります。

Windows Identity Foundation(WIF)は、クレーム対応アプリケーションで使用できるように、コンピュータにインストールする必要がある帯域外ランタイムです。 WIFはWindows Azureインスタンスにデフォルトではインストールされません。クラウドクレーム認識アプリケーションを実行するには、Windows AzureインスタンスでWIFランタイムを使用可能にする必要があります。最も簡単な方法は、展開パッケージにWIFアセンブリを含めることです。

は、WindowsのAzureの展開パッケージソリューションエクスプローラで

  1. とWIFアセンブリを含んで、あなたの要求に対応するアプリケーションを見つけます。
  2. [参照]フォルダーを展開します。
  3. 参照フォルダの下にMicrosoft.IdentityModelアセンブリを配置します。
  4. アセンブリを右クリックし、[プロパティ]をクリックします。
  5. [プロパティ]ウィンドウで、[ローカルをTrueおよび特定のバージョンをFalseにコピー]を指定します。

既定では、WIFはデータ保護アプリケーションプログラミングインターフェイス(DPAPI)を使用して暗号を暗号化して保護します。 DPAPIはWindows Azureでは使用できません。クラウドクレーム対応WebアプリケーションがWindows Azureに展開されたときに正しく機能するようにするには、RSAを使用してCookie暗号化機能を追加する必要があります。クラウドクレーム対応のWebアプリケーションを見つけ、ソリューションエクスプローラでRSA

  1. を使ってクッキーを暗号化するために

  2. Visual Studioエディタで、global.asaxファイルの背後にあるコードであるglobal.asax.csファイルを開きます。

次の宣言を追加します。

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; 

詳しい情報はここで見つけることができます:

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

は、次のコードを追加しますhttp://msdn.microsoft.com/en-us/library/hh289318.aspx

2

これがでWIFを使用して一般的な例外はありますfarm環境。要点は、DPAPIを使用してCookieを暗号化することです。ただし、DPAPIはMachineKeyにバインドされています。

Global.Asaxで少し変更を加え、RSA Cryptoサービスプロバイダを使用してFedAuth Cookieを暗号化/復号化する必要があります。 this article on how to achieve thatをご覧ください。

1

Windows AzureウェブサイトインスタンスとしてデプロイされたMVC 4アプリケーションと、クラウドサービスを使用してACSを利用しようとしているときに同様の問題が発生しました。以下は、この問題を解決するのに役立ちました。 http://msdn.microsoft.com/en-us/library/hh568644.aspx

一番下までスクロールして、SessionSecurityTokenHandlerを削除し、MachineKeySessionSecurityTokenHandlerで置き換える例を見つけます。

関連する問題