接上篇: ASP.NET Core 3.1 实际操作摸索学习 (Identity部分) - 2
分别测试了几种情况:
最后总结:如果要考虑以后扩展用户属性等灵活性要求,建议还是在新建项目时不要直接选择个人认证,而是在建好项目后再手动加认证基架;
同时,在选择新增DBContext的同时,选择新增用户类,不然以后要想增加用户属性字段,需要手动调整很多地方;
后面按照先有一个带DBContext的MVC应用需要增加Identity 认证来做一些记录:
第1步:先创建一个MVC 项目,用Nuget安装 entityframework
主要是安装: Microsoft.EntityFamewordkCore
和 Microsoft.EntityFamewordkCore.SqlServer (如果用其他数据库根据需要替换)
还要再装个 Microsoft.EntityFramwordCore.Tools:
第2步:搞个Model ,搞1个DBContext ,然后初始化数据库;
public class Book { [Key] public string Id { get; set; } [Required] public string Name { get; set; } public string Desc { get; set; } public string Author { get; set; } public decimal Price { get; set; }
}
using Microsoft.EntityFrameworkCore; using MyCoreTest2.Models; namespace MyCoreTest2.Data { public class BookAppContext : DbContext { public BookAppContext(DbContextOptions<BookAppContext> options) : base(options) { } public DbSet<Book> Books { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Book>().HasData( new Book { ID = 1, Name = "ASP.NET Core MVC", Desc = "ASP.NET相关", Author = "ABC", Price = decimal.Parse("199.01") }, new Book { ID = 2, Name = "ASP.NET Core WEBAPI", Desc = "ASP.NET相关", Author = "XYZ", Price = decimal.Parse("99.01") }); base.OnModelCreating(modelBuilder); } } }
appsettings.json加上数据库连接字符串:
"ConnectionStrings": { "SqlServerConnection": "Server=(localdb)\\mssqllocaldb;Database=MyCoreTest2;Trusted_Connection=True;MultipleActiveResultSets=true;" },
为了控制器里可以使用Context,需要在StartUp中ConfigureServices 中注入,StartUp中增加:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<BookAppContext>(option => option.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"))); services.AddControllersWithViews(); }
齐活,用数据库迁移来创建数据库表:
Add-Migration IniCreate
再执行 Update-Database
第4步:直接在Home页面列表显示Model;
这步简单... 略过...
第5步:加入Identity基架,选择新增Context和用户类
自动添加了 Context和用户类, (用户类是空的,可以根据需求增加字段)
虽然两个Context (一个是Identity Context 一个是原应用Context) ,但是希望用一个数据库;
那么就把 IdentityHostingStartup里 数据库字符串改成和原应用Context对应一个字符串:
builder.ConfigureServices((context, services) => { services.AddDbContext<MyCoreTest2Context>(options => options.UseSqlServer( context.Configuration.GetConnectionString("SqlServerConnection")));
给用户类增加一个 备注 字段:
using Microsoft.AspNetCore.Identity; namespace MyCoreTest2.Areas.Identity.Data { // Add profile data for application users by adding properties to the MyCoreTest2User class public class MyCoreTest2User : IdentityUser { public string Remark { get; set; } } }
如果直接迁移:
加上 -Context 参数来指定Context:
可以看到表已增加在原数据库上,并且用户表增加了 备注字段:
如果要想为Role增加一个自定义字段,怎么办? (目前还没试验出来。。。后补)
还需要修改 Startup的 Configure:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); }
当第一选择新建Context 及 User 类后,后面如果再加基架里的其他页面,可以下拉直接选择已新建的Context;