ASP.NET Core 2.x现在将身份页面和逻辑隐藏在库中。为了使用新属性扩展IdentityUser
实体并添加UI和逻辑以处理这些新属性,我们现在运行“ Identity scaffolder”(在MyProject-> Add-> New scaffolded item下)。不幸的是,the docs充其量是不完整的,在许多情况下,完全是错误的。
我正在努力弄清楚如何对脚手架进行搏斗,最终的代码来实现我认为是相当标准的用例:
IdentityUser
。由于这涉及创建继承的类,因此我希望该新类的名称为ApplicationUser
。ApplicationDbContext
我的问题是,在阅读文档并使用Identity脚手架时,我不知道如何获得该脚手架以让我扩展IdentityUser
并继续使用现有的脚手架ApplicationDbContext
。
答案 0 :(得分:3)
盯着the docs并使用脚手架和生成的代码后,我想我已经弄明白了。
ApplicationDbContext
。ApplicationDbContext
这时,您的项目已连接到现有的ApplicationDbContext
和IdentityUser
类。现在,您可以扩展IdentityUser
并连接“身份”页面以使用新的扩展实体:
添加一个新的ApplicationUser
类,该类继承自IdentityUser
:
public class ApplicationUser : IdentityUser
{
public string Nickname { get; set; }
}
将新的ApplicationUser
实体添加到ApplicationDbContext
类中:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<ApplicationUser> AppUsers { get; set; }
}
将<IdentityUser>
的所有实例替换为<ApplicationUser>
。这意味着您将更改startup.cs以调用services.AddDefaultIdentity<ApplicationUser>()
,并将所有对SigninManager
和UserManager
的引用替换为指定新的<ApplicationUser>
Type参数。 / p>
为什么...现在,您可以进入Register.cshtml.cs之类的内容,并创建(或获取)新的ApplicationUser
而不是IdentityUser
,所有管道都将被连接最多ApplicationUser
。例如,Register.cshtml.cs中的代码可能如下所示:
var user = new ApplicationUser {
UserName = Input.Email,
Email = Input.Email,
Nickname = Input.Nickname // New property
};
var result = await _userManager.CreateAsync(user, Input.Password);
答案 1 :(得分:0)
通常,ApplicationDbContext
在没有身份的情况下继承自DbContext
。
我有四个项目的解决方案。 WEB
,WebAPI
,DATA
和ENTITIES
。
我在ApplicationDbContext
中有一个DATA
,并对其进行了修改以继承自IdentityDbContext
,例如:
public class ApplicationDbContext : IdentityDbContext<IdentityUser>
现在,ENTITIES
是定义模型(POCO)的地方。
并且,AppliationDbContext
中的DATA
包含对这些类的引用,并包含EF使用的DbSet<T>
属性设置器。 Person
中的ApplicationUser
(又名ENTITIES
)类如下:
public class Person : IdentityUser
{
[PersonalData]
public string LastName { get; set; }
在WEB
项目中,有对DATA
和ApplicationDContext
的适当引用,我只有一个services.AddDbContext<T>
依赖项引用;然后在AddDefaultIdentity<IdentityUser>()
服务添加中使用该上下文。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
似乎只使用一项DbContext
服务就可以了。它还扩展了AspNetUsers
表,以包括我在[PersonalData]
内的POCO Person
模型类中设置的ENTITIES
属性。
现在,因为
<IdentityUser>
已扩展,以我为例,Person
已扩展了对IdentityUser
的所有引用以反映这一点。因此Startup.ConfigureServices
现在看起来像这样:
services.AddDefaultIdentity<Person>()
.AddEntityFrameworkStores<ApplicationDbContext>();
而且,在用户界面内,要访问“人物”添加的属性,~/Identity/Account/Manage/Index.cshtml.cs
中的引用也需要更新:
private readonly UserManager<Person> _userManager;
private readonly SignInManager<Person> _signInManager;
private readonly IEmailSender _emailSender;
public IndexModel(
UserManager<Person> userManager,
SignInManager<Person> signInManager,
IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_emailSender = emailSender;
}
您将必须更新index.cshtml.cs
中的'InputModel'和OnGetAsync()
方法中的'new up'来映射属性-与Email
的处理方式类似默认设置。
最后,有一个index.cshtml
视图文件可以访问UI /剃须刀显示。
这应该可以让您带着问题中的第1-4条进入您的行列。