ASP.NET MVC v5、Entity Framework v7、および Identity v3 でコード ファーストのアプローチを使用して、単純なログイン システムをゼロから構築しようとしています。Visual Studio に付属している個々のユーザー ログイン テンプレートを使用して、ASP.NET MVC アプリの後に自分のアプリをモデル化しています。
私が望むのは、ユーザーがアカウントを作成し、そのアカウントがデータベースに保存されることだけです。
これが私がこれまでに持っているコードです:
Startup.cs :
public class Startup
{
public IConfigurationRoot Configuration { get; set; }
public Startup()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}
appsettings.jsonには、データベースに接続するための次のコードが含まれています。
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=SimpleAuthenticationApp;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Controllers/AccountController.csの Register POST アクションのコードは次のとおりです。
[HttpPost]
public async Task<IActionResult> Register (RegisterViewModel model)
{
try
{
var user = new ApplicationUser { UserName = model.Email };
IdentityResult result = await _userManager.CreateAsync(user, model.Password);
Console.WriteLine(result);
return View("Home", "Index");
}
catch (Exception ex)
{
Console.WriteLine(ex);
return View();
}
}
このコードでRegisterViewModel
は、Email、Password、および ConfirmPassword のフィールドを持つ単なる ViewModel です。Account/Registerビューは、これらのフィールドを要求する単なるフォームです。ApplicationUser
から拡張されたクラスですIdentityUser
。
POST ルートで、try ブロックにブレーク ポイントを設定し、catch ブロックに入ると、「無効なオブジェクト名 AspNetUsers」という例外が表示されます。
このアプリで最初のユーザーを作成する前は、データベースがありません。新しいユーザーを登録すると、アプリによって、「ApplicationDbContext の既存の移行を適用すると、この問題が解決する可能性があります」というエラー ページが表示され、移行を適用するボタンが表示されます。ボタンを押すと、データベースが作成されます。ユーザー アプリで既定の MVC を実行すると、00000000000000_CreateIdentitySchema.csとApplicationDbContextModelSnapshot.csを含むMigrationsフォルダーがあり、必要なテーブルを含むデータベースを作成するための設定が含まれているように見えます。アプリでこれらのファイルを使用してみましたが、違いはありませんでした。
私の質問:
Identity/Entity Framework は、ユーザー情報のテーブルを含むデータベースをどのように作成しますか? アプリのデータベースを作成する前に「移行を適用」する必要があるのは奇妙に思えます。
自分のアプリで簡単なユーザー ログインを機能させるにはどうすればよいですか? 他のアプローチやフレームワークは大歓迎です。