バックグラウンド
従来のASP.NETフォームアプリからMVC4アプリへの反復的な移行を開発しています。
この移行は段階的に、一度に1つのセクションで行われるため、レガシーMVCアプリケーションと新しいMVCアプリケーションの両方を同時に実行する必要があります。一部のセクションでは、ユーザーは新しいアプリケーションに誘導され、まだ移行されていないセクションでは、ユーザーはレガシーアプリケーションに戻されます(またはそのまま残ります)。
サーバー上では、アプリケーションは次のように構成されています。
LEGACY (.NET 2.0 forms app)--
|--Api (new MVC 4 WebAPI)
|--V2 (new MVC 4)
つまり、foo
レガシーのページへの呼び出しは/foo.aspx
であり、V2ではそれ/V2/foo
です。
すべてがC#で実行されますが、レガシーアプリは.NET 2.0で実行され、V2アプリは.NET4.5で実行されていることに注意してください。これが重要かどうかはわかりませんが、注意することが重要だと思いました。
問題
アプリケーション間でユーザー/認証状態を正常に共有できません。明らかに、ユーザーがレガシーアプリにログインしている場合、ユーザーが再度ログインするように求められないように、V2ページが呼び出されたときにV2アプリで認証Cookieを取得する(または同様のアクションを実行する)必要があります。
私が試したこと
両方のweb.configファイルに同一authentication
の要素を設定しました。machinekey
<authentication mode="Forms">
<forms cookieless="UseCookies" defaultUrl="~/someUrl" loginUrl="/" path="/" protection="All" timeout="240" enableCrossAppRedirects ="true" domain="someDomain.com" requireSSL="false" />
</authentication>
<machineKey validationKey="DE78CF63226. . .788658D142AB881" decryptionKey="0B97E8BA4C4EB4B4C524. . .54E4622E14168D2D5C84461FA2" validation="SHA1" decryption="AES" />
私はV2アプリケーションのGlobal.asaxでこのコードを試しました:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (authCookie == null)
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch
{
return;
}
if (authTicket == null)
{
return;
}
string[] roles = authTicket.UserData.Split(new char[] { '|' });
var id = new FormsIdentity(authTicket);
var principal = new GenericPrincipal(id, roles);
//Thread.CurrentPrincipal = principal;
Context.User = principal;
}
しかし、レガシーアプリが私のV2アプリと同じソリューションにないため、それが機能するかどうかはわかりません。したがって、V2アプリをデバッグするときに、レガシーアプリを介してログインしてシミュレーションする方法がありません。レガシーとV2の間を行き来する実際のユーザーエクスペリエンス。
HomeController
また、同じマシンキーが魔法のように機能することを期待して、これを追加してみました。
ViewBag.UserName = User.Identity.Name;
明らかに、ビュー内のhtml要素にバインドViewBag.UserName
しますが、これも機能しないようです。