私は新しいMVC 5で遊んでいて、いくつかのモデル、コントローラ、ビューをコードファーストマイグレーションを使ってセットアップしています。
質問は、ユーザーとロールをどのようにシードするかということです。私は現在、Configuration.csのSeedメソッドでいくつかの参照データをシードしています。しかし、私には、何かが最初にAccountControllerに当たるまで、ユーザーとロールのテーブルが作成されないように見えます。
現在、私は2つの接続文字列を持っていて、認証からデータを異なるデータベースに分離することができます。
どうすれば、user, roles などのテーブルを他のテーブルと一緒に入力させることができますか?アカウントコントローラがヒットしたときではなく?
ここでは、通常のSeedのアプローチの一例をご紹介します。
protected override void Seed(SecurityModule.DataContexts.IdentityDb context)
{
if (!context.Roles.Any(r => r.Name == "AppAdmin"))
{
var store = new RoleStore<IdentityRole>(context);
var manager = new RoleManager<IdentityRole>(store);
var role = new IdentityRole { Name = "AppAdmin" };
manager.Create(role);
}
if (!context.Users.Any(u => u.UserName == "founder"))
{
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
var user = new ApplicationUser {UserName = "founder"};
manager.Create(user, "ChangeItAsap!");
manager.AddToRole(user.Id, "AppAdmin");
}
}
package-manager "update-database" を使ってみました。DBとすべてのテーブルが作成され、データがシードされました。
小さな追加ですが、シード時に「UserId not found."」というメッセージが出る方へ:(Tom Reganがコメントでこの質問をしていて、私もしばらく困っていました。)
これは、manager.Create(user, "ChangeItAsap!") がうまくいかなかったことを意味します。 これは別の理由かもしれませんが、私の場合は、パスワードの検証に成功しなかったためでした。
私はカスタムパスワードバリデーターを使用していましたが、データベースをシードする際に呼び出されなかったので、私が慣れている検証ルール(デフォルトの6ではなく、4分の長さ)が適用されなかったのです。パスワード(および他のすべてのフィールド)がバリデーションを通過していることを確認してください。
MVC5で認証方法が変更されたようで、Global.asax.csを以下のように変更したら、うまくいきました。
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using System.Threading.Tasks;
using MvcAuth.Models;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using System.Threading;
using Microsoft.AspNet.Identity.EntityFramework;
namespace MvcAuth
{
public class MvcApplication : System.Web.HttpApplication
{
async Task<bool> AddRoleAndUser()
{
AuthenticationIdentityManager IdentityManager = new AuthenticationIdentityManager(
new IdentityStore(new ApplicationDbContext()));
var role = new Role("Role1");
IdentityResult result = await IdentityManager.Roles.CreateRoleAsync(role, CancellationToken.None);
if (result.Success == false)
return false;
var user = new ApplicationUser() { UserName = "user1" };
result = await IdentityManager.Users.CreateLocalUserAsync(user, "Password1");
if (result.Success == false)
return false;
result = await IdentityManager.Roles.AddUserToRoleAsync(user.Id, role.Id, CancellationToken.None);
return result.Success;
}
protected async void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
bool x = await AddRoleAndUser();
}
}
}