同じサーバーで 2つの.NET Webアプリケーションを実行しています。
Sentinel は認証「ポータル」です。FortKnox は、フォーム認証を使用する「概念実証」アプリですが、loginUrl がhttps://sentinel.mydomain.com/loginに設定されています(ReturnUrl を修飾する特別な Application_EndRequest ハンドラーと共に)。Sentinel は、MVC 4 と Razor を使用して .NET 4.0 で作成されています。FortKnox は、.NET 2.0 を使用した ASP.NET MVC 2 です。
.mydomain.com
Cookie ドメインを に設定して ASP.NET FormsAuthentication を使用していsentinel.mydomain.com
ますwww.mydomain.com
。Cookie 部分は完全に機能しています。両方のアプリケーションが同じ .ASPXAUTH 暗号化フォーム チケットを取得しています。
問題は、本番サーバーでは、fortknoxがセンチネルによって作成された Cookie を復号化できないことです。たとえそれらが同じマシン キーを持っていたとしてもです。両方のアプリが同じ物理ボックスで実行されている場合でも、機能しません。
ユーザーが fortknox をヒットすると、sentinel にリダイレクトされ、ログインし、Cookie が設定され、fortknox にリダイレクトされて、「データを検証できません」というメッセージが表示されます。
Exception: Unable to validate data.
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo, Boolean signData)
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
at System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)
at FortKnox.Web.MvcApplication.Application_BeginRequest()
マシンキーは同じです - 各ページのマークアップにこの (厄介な!) コードのチャンクを含めるところまで行きました:
try {
var cookie = Request.Cookies[".ASPXAUTH"].Value;
Response.Write("Cookie: " + cookie + Environment.NewLine);
var ticket = FormsAuthentication.Decrypt(cookie);
Response.Write("Ticket name: " + ticket.Name + Environment.NewLine);
} catch (Exception x) {
Response.Write("Exception: " + x.Message + Environment.NewLine);
Response.Write(x.StackTrace);
}
Response.Write("<hr /></pre>");
var machineConfigMachineKey = (MachineKeySection)WebConfigurationManager.OpenMachineConfiguration().SectionGroups["system.web"].Sections["machineKey"];
var webConfigMachineKey = (MachineKeySection)WebConfigurationManager.OpenWebConfiguration("").SectionGroups["system.web"].Sections["machineKey"];
Response.Write("<pre>");
Response.Write("<b>machine.config decrypt: </b>" + machineConfigMachineKey.DecryptionKey + "<br />");
Response.Write("<b>web.config decrypt: </b>" + webConfigMachineKey.DecryptionKey + "<br />");
Response.Write("<br />");
Response.Write("<b>machine.config validate: </b>" + machineConfigMachineKey.ValidationKey + "<br />");
Response.Write("<b>web.config validate: </b>" + webConfigMachineKey.ValidationKey + "<br />");
Response.Write("</pre>");
Response.Write("<hr />");
実行時に使用されているマシン キーがまったく同じであることを確認しました。
特にイライラするのは、これが開発サーバーとステージングサーバーで機能しており、本番環境でのみ失敗したことです. サーバー間の唯一の違いは、運用ボックスには Windows Update が頻繁にインストールされているのに対し、開発/ステージング ボックスには一部の更新プログラムが不足している可能性があることです。それ以外は同一です (同じイメージから複製され、同じセットアップ スクリプトを使用して作成されます)。
だから...同じサーバー。同じマシンキー。ASP.NET 4 は FormsAuthentication Cookie を設定します。ASP.NET 2 アプリは暗号化を解除できません。特定のサーバーでのみ発生するバグ。他の人では、それは機能しています。この時点で、私は完全に立ち往生しています...何かアイデアはありますか?
編集:ライブサーバーは最新のパッチレベルにまで引き上げられました。応募してみました
<add key="aspnet:UseLegacyEncryption" value="true" />
ログインアプリと fortknox アプリの両方に対して true と false の両方として。まだ運がない...