27

認証にWIF(.net 4.5)とAzureActiveDirectoryを使用しています。WebサイトはAzure上に配置されます。

すべてがローカルで期待どおりに機能しますが、紺碧に置くとエラーが発生します。

データ保護操作は失敗しました。これは、現在のスレッドのユーザーコンテキストに対してユーザープロファイルがロードされていないことが原因である可能性があります。これは、スレッドが偽装している場合に発生する可能性があります。

これは、アプリがDAPIを使用できないためであると理解しています。そのため、アプリをMACで保護するように切り替える必要があります。

ローカルでこれをwebconfigに追加しました:-

 <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" />
  </securityTokenHandlers>

ドキュメントで推奨されているように、静的なマシンキーを追加しましたが、キーの長さに関するアドバイスが見つからないため、256と想定しています。

ただし、この構成では次のエラーが発生します。

[CryptographicException:暗号化操作中にエラーが発生しました。] System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func、Byte [] input)+115 System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte [] protectedData)+59 System.Web.Security.MachineKey.Unprotect(ICryptoServiceProvider cryptoServiceProvider、Byte [] protectedData、String []の目的)+62 System.Web.Security.MachineKey.Unprotect(Byte [] protectedData、String []の目的)+ 122 System.IdentityModel.Services.MachineKeyTransform.Decode(Byte []エンコード)+161 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte [] cookie、ブールアウトバウンド)+123 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReaderリーダー、SecurityTokenResolver tokenResolver)+575 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte [] token、SecurityTokenResolver tokenResolver)+76 System.IdentityModel.Services.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte [] sessionCookie)+833System.IdentityModel.Services.SessionAuthenticationModule。 TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)+186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender、EventArgs eventArgs)+210 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+136System.Web.HttpApplication。 ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+69SecurityTokenResolver tokenResolver)+76 System.IdentityModel.Services.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte [] sessionCookie)+833 System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)+186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object EventArgs eventArgs)+210 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+136 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+69SecurityTokenResolver tokenResolver)+76 System.IdentityModel.Services.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte [] sessionCookie)+833 System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)+186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object EventArgs eventArgs)+210 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+136 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+69TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)+186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender、EventArgs eventArgs)+210 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+136System.Web.HttpApplication。 ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+69TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)+186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender、EventArgs eventArgs)+210 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+136System.Web.HttpApplication。 ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+69

正しくフォーマットされたキーを指定しなかった場合に備えて、machinekeyセクションを削除しましたが、エラーは解消されません。

WIFはなんと戦いました!

4

5 に答える 5

48

構成でmachineKeyを指定しない場合、Azureはそれを追加します。ただし、アプリケーションの新しいバージョンを作成し、VIPスイッチングを使用してAzureにデプロイすると、Azureはステージングでのデプロイメント用に新しいマシンキーを生成します(最初のデプロイメントが本番環境であると想定)。(VIP切り替えは、新しいバージョンを展開してから、本番環境とステージングの間で仮想IPアドレスを切り替えるための優れたメカニズムです)。

したがって、基本的に1つの解決策は、Azureにキーを生成させることですが、VIP切り替え後、問題が発生します。これを回避するには、Application_ErrorハンドラーのGlobal.asaxでCryptographicExceptionをキャッチします。次のようになります。

// Be sure to reference System.IdentityModel.Services
// and include using System.IdentityModel.Services; 
// at the start of your class
protected void Application_Error(object sender, EventArgs e)
{
    var error = Server.GetLastError();
    var cryptoEx = error as CryptographicException;
    if (cryptoEx != null)
    {
        FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
        Server.ClearError();
    }
}

SignOut()メソッドにより、Cookieが削除されます。

編集:@anjdreasによって示されるように、machineKeyの生成に関する情報を更新しました。

もう1つの解決策は、machineKeyを生成することです。IISマネージャーを使用して生成できます。詳細については、 MachineKeyを生成する最も簡単な方法を参照してください。Azure Webロール内のすべてのWebアプリケーションに同じキーを配置した場合、Azure展開プロセスはそれを置き換えません。

于 2013-04-23T12:21:45.633 に答える
4

マシンキーは存在しないはずです。WindowsAzureはマシンキーを生成し、ロール内のすべてのインスタンスで同一であることを確認します。

表示されているエラーについて:Cookieをクリアしてみてください。

于 2013-01-02T12:29:52.000 に答える
2

この場合、Cookieをクリアするだけで、問題全体が解決しました。

于 2014-08-02T16:12:29.727 に答える
0

フォーム認証を使用している場合。例外をキャッチしたときにサインアウトして、ユーザーがログインして有効なCookieを作成できるようにすることができます

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}
于 2014-10-05T16:58:54.243 に答える
-2

すべてのユーザーにすべてのCookieをクリアするように依頼することは、私にとって実際の選択肢ではありませんでした。このサイトと「ProgrammingWindowsIdentityFederation」という本で、私はより良い解決策を見つけました(とにかく私にとって)。すでにSSL証明書をAzureにアップロードしている場合は、その証明書を使用してすべてのAzureインスタンスのCookieを暗号化することもでき、新しいマシンキーやIISユーザープロファイルなどについて心配する必要はありません。

于 2015-03-19T01:22:56.147 に答える