私は気が狂いそうになるので、もう一度助けを求めようと思います... Visual Studio Express 2012 for Web を使用して、C# + MVC4 + Razor + Entity Framework + ASP.NET を使用してインターネット プロジェクトを作成しています。 4.5. 次のことを行う必要があります。「管理者」ユーザー (サイト全体で承認される) を自動的に作成し、いくつかのユーザー ロールを作成します。SimpleMembership、ロール、およびすべての Web 上のすべてについて読みましたが、すべてを機能させるための簡単な方法は何もないようです。
これは私がこれまでに行ったことです:
1- DataContext クラスを作成しました:
public class DataContext : DbContext
{
public DataContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
2-管理者ユーザーと管理者ロールが作成されると想定する初期化クラスを作成しました。
public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
var roles = (Webmatrix.WebData.SimpleRoleProvider)System.Web.Security.Roles.Provider;
var membership = (Webmatrix.WebData.SimpleMembershipProvider)System.Web.Security.Membership.Provider;
if (!roles.RoleExists("Admins")) {
roles.CreateRole("Admins");
}
if (membership.GetUser("admin", false) == null) {
membership.CreateUserAndAccount("admin", "123456");
}
if (!roles.GetRolesForUser("admin").Contains("Admins")) {
roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
}
}
(DropCreateDatabaseIfModelChanges から継承しようとしましたが、それは役に立ちません)。
3- Global.asax の App_Start メソッドに次の 2 行を追加しました。
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Database.SetInitializer<DataContext>(new DataContextDbInitializer());
また、DataContextDbInitializer クラスの Seed メソッドで WebSecurity.InitializeDatabaseConnection を使用しようとしましたが、機能しませんでした。
4- [InitializeSimpleMembership] 注釈を AccountController から削除したため、アプリケーション ライフ サイクルの最初から初期化できます (3 番目で説明したように、App_Start で WebSecurity.InitializeDatabaseConnection を使用します)。HomeController の Index メソッドの上に [InitializeSimpleMembership] を追加し、App_Start から WebSecurity.InitializeDatabaseConnection を削除しようとしましたが、どちらも役に立ちません。
5- Web.config では、フォーム (既定) として認証方法を使用し、既定の接続文字列も残しました。
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-TPFinal-20130121210447;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-TPFinal-20130121210447.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
そして、これを system.web タグ内に追加しました:
<roleManager enabled="true" cacheRolesInCookie="true" />
6-次に、すべてが機能するかどうかをテストするために、HomeController の About() メソッドの上に [Authorize(Roles = "Admins")] アノテーションを使用します。期待どおりに動作していた場合、HomeController/About によって制御される「About」ページを表示できるようにするには、admin/123456 としてログインする必要があります。
7- EF の移行などは追加していません。VS2012が自動的に作成したため、他のすべてのものはデフォルトです。そこで、アプリケーションを実行して [About] リンクをクリックすると、ログイン フォームが表示されます (つまり、[Authorize(Roles = "Admins")] アノテーションが期待どおりに機能していることを意味します)。admin/123456 としてログインしようとしましたが、ログイン ボタンをクリックするたびに、ログイン ページが何度もリロードされます。
私が気づいたいくつかのこと:
-シード メソッドにブレークポイントを追加すると、呼び出されないようです。
-DropCreateDatabaseAlways を使用してアプリケーションを再度実行すると、admin/123456 としてログインできます。DB を最初から作成する必要があると想定しているため、DataContextDbInitializer クラス全体が使用されていないことをもう一度考えさせられます。これにより、管理者ユーザーが削除されます。
他に何を読むべきか、他に何を試すべきかわかりません...私はasp.netを初めて使用し(それを言う必要がありますか?)、ただ夢中になっています。ありがとう!!