5

バックグラウンド

従来の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しますが、これも機能しないようです。

4

3 に答える 3

2

フォーム認証の署名および暗号化アルゴリズムは、.NET 2.0 と 4.0 の間で切り替えられました。だからあなたの4.0設定で試してください

<appSettings>
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
</appSettings>

CSRF に対して脆弱な webapi エンドポイントにヒットする永続的な認証方法があり、それから保護する必要があることに注意してください。Mike Wasson がasp.netでウォークスルーを公開しています

于 2013-03-20T16:35:35.070 に答える
2

親アプリで machineKey compatibilityMode="Framework20SP2" を設定します。

.net 4.5 は 4.0 (またはそれ以下) からの認証トークンを読み取ることができません

http://technet.microsoft.com/en-us/subscriptions/index/system.web.configuration.machinekeycompatibilitymode

http://blogs.msdn.com/b/webdev/archive/2012/10/23/cryptographic-improvements-in-asp-net-4-5-pt-2.aspx

于 2013-03-21T01:10:27.787 に答える
1

2つのアプリに使用しているドメイン/サブドメインは何ですか?Cookieはドメイン間またはサブドメイン間でさえ共有されません(Cookieがワイルドカードドメイン、つまり* .mydomain.comに設定されている場合を除く)。

たとえば、V1アプリがv1.somedomain.comにあり、Cookieがv1.somedomain.comに設定されている場合です。その場合、v2.somedomain.comのV2はそれを認識しません。ただし、*。somedomain.comにCookieを設定すると、両方のアプリにCookieが表示されます。

ただし、V1がv1domain.comにあり、V2がv2domain.comにある場合は、運が悪いです。Cookieを共有する方法はありません。

于 2013-03-20T16:17:44.400 に答える