VS2012をASP.NET4.5およびMVC4.0と一緒にダウンロードし、サンプルアプリでタイヤを蹴っていたところ、ASP.NET 4.0/MVC3で完全に機能するフォーム認証が機能しなくなったようです。最新のリリース。
アクションコントローラーのLogin関数を呼び出すと、WebSecurity.Login呼び出しが失敗します。
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
このコードをVS2010ソースの同等のコードに置き換えましたが、これも失敗します(現在は非推奨のFormsAuthentication.Authenticate関数を使用)。
私の質問は:MVC3をMVC4アプリに移植し、この問題の回避策を見つけた人はいますか? IIS Expressを使用しているので、なんらかの問題が発生しているのではないかと思いますが、何かアイデアがあればありがたいです。
動作中のasp.net4/MVC3アプリから次のように構成をコピーしましたが、運がありません(関連する部分は次のとおりです)。
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=tcp:sql2k1201.dbprovider.net;Initial Catalog=SQL2012_db;User ID=SQL2012_db_user;Password=dbpassword;" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880"/>
</authentication>
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnection"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="DefaultConnection" applicationName="/" />
</providers>
</profile>
<roleManager enabled="true">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="/" />
</providers>
</roleManager>
ここでの問題は、デフォルトのmvc4インターネットテンプレートがSimpleMembershipを使用してメンバーシップ/ロール情報を管理していることです。テンプレート内のコードはこれを前提としており、simplemembershipでのみ機能します。ユニバーサルプロバイダーをインストールすると、ユニバーサルプロバイダーを理解できないため、アカウントコントローラーコードが爆発します。このシナリオについてさらに説明しているこの投稿を見てください http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new- asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx
古いバージョンの.NETFrameworkを使用するアプリケーション間でフォーム認証チケットを共有する必要がある場合は、以前のマシン互換モードを使用するように.NET 4.5アプリを明示的に構成する必要があります。そうしないと、フォームを暗号化/復号化できません。認証チケット。
.net 4.5アプリケーションのweb.configで、互換モード属性を設定します。
<system.web>
<machineKey compatibilityMode="Framework20SP2" />
</system.web>
これにより、.NET 4.5アプリは、以前の.NETバージョンで生成されたフォーム認証チケットを使用できるようになります。
注:サーバーに.NET Framework 2.0 SP2がインストールされていない場合は、代わりに互換モードを「Framework20SP1」に設定する必要があります。
私にとっては、必要なweb.config設定にいくつかの変更があるため、問題が発生しました( http://www.asp.net/whitepapers/mvc4-release-notes から)
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="PreserveLoginUrl" value="true" />
</appSettings>
これらの設定を修正すると(追加したようには見えません)、ログインの問題が発生したときに問題が発生しました。