使用Asp.Net Identity数据库优先方法

62

我需要将最新的Asp.Net MVC版本与一个已有的数据库集成,该数据库的表dbo.AspNetUsers中有一个额外的列String Address

我需要创建一个名为ApplicationUser的实例,其中包含属性Address。

你有任何想法如何做到这一点吗?


1
有趣的内容:http://www.itorian.com/2013/11/customize-users-profile-in-aspnet.html - GibboK
相关内容:https://dev59.com/rWIj5IYBdhLWcg3wv3e2 - GibboK
5个回答

59

一个适用于我的可能解决方案,基本上我能够将Asp.Net Identity用户档案与现有数据库集成。

获取Asp.Identity表:

  • 创建带有Individual User Account身份验证的MVC项目。
  • 打开Web.config中DefaultConnection下列出的数据库。它将被称为(aspnet-[时间戳]或类似名称)。
  • 使用SQL Server Management Studio脚本数据库表(附加到mdc的数据库)。

或者可以使用像http://identity.codeplex.com/这样的工具。

与现有数据库集成:

  • 将脚本表插入SQL Server Management Studio中的现有数据库。
  • 自定义并添加与ApplicationUser的关系(如果需要)。
  • 创建新的Web项目>MVC>DB First项目>使用EF导入数据库....
  • 在IdentityModels.cs中将ApplicationDbContext :base("DefaltConnection")更改为使用您项目的DbContext。

现在,您的数据库中具有Asp.Identity表和ER模型。

Asp.Identity添加新属性:

  • 启用实体框架Code First数据库迁移,只需在VS中转到Tools 'Package Manager Console',
  • 执行命令“Enable-Migrations”; 一旦我们启用了数据库迁移,我们就可以继续为UserProfile添加新属性

  • 要添加新属性,请修改IdentityModels.cs文件,例如:


public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailID { get; set; }
}

添加新迁移

  • 在添加属性后,打开程序包管理器控制台并执行以下命令:

    Add-Migration "YouMigrationName"

此命令将生成一个数据库脚本文件,现在执行以下命令来运行此脚本文件以针对数据库运行。

Update-Database
现在,所有新属性都会成为同一个数据库表中的表字段。
我希望这能对其他人有所帮助,如果你有更好的想法请告诉我。

1
实际上这对我不起作用。我已经启用了迁移,添加了新属性,添加了新的迁移,但是当我尝试“Update-Database”时,它会显示“数据库中已经存在名为'AspNetRoles'的对象。”。因此,它似乎并没有更新数据库,而是尝试重新创建它。 - bsaglamtimur
1
我可以知道为什么所有的ASP.NET MVC都使用LocalDB作为默认身份验证数据库吗? - Timeless
29
如果是数据库优先的方法,为什么要使用迁移?我的理解是,迁移是用于代码优先方法中将代码更改应用于数据库的。 - Andrey
一个人实际上在哪里可以找到“(aspnet-[timestamp]或类似的东西)”?它存在于项目文件夹中吗? - Jamie M.
13
为什么我找到的每一篇关于实体表的数据库优先讨论都涉及到Code First? - Jonathan Wood
显示剩余2条评论

20

有没有其他资源可以教我如何使用 https://github.com/kriasoft/AspNet.Identity,因为它的文档并没有提供太多信息。如果我不是从头开始,我只是想将我的身份上下文链接到我的数据库上下文,该怎么办? - Zapnologica
1
@Zapnologica,嗯...它更适合数据库优先方法,您可以根据实际的数据库模式生成EF DbContext / Model。 - Konstantin Tarkus
那这个方法不能和“数据库优先(db first)”一起使用吗?我能想到的唯一办法就是重新实现所有存储并使用指向我的“数据库优先”模型的自己的dbContext - Zapnologica
@Zapnologica ASP.NET Server Template 项目包含一个完整的 ASP.NET Identity 解决方案和 EF DbFirst 开发方法的示例。 - Konstantin Tarkus

2

最近我也遇到了同样的问题。我使用了DBFirst方法创建了一个应用程序,现在需要添加Identity。以下是我的解决方案:

  1. 安装以下软件包:
   1. Microsoft.EntityFrameworkCore
   2. Microsoft.EntityFrameworkCore.Design
   3. Microsoft.EntityFrameworkCore.SqlServer
   4. Microsoft.AspNetCore.Identity
   5. Microsoft.AspNetCore.Identity.EntityFrameworkCore
   6. Microsoft.AspNetCore.Aututhentication.JwtBearer
  1. DbContext是否继承自IdentityDbContext,像这样:
public partial class BookStoresDBContext : IdentityDbContext
  1. 在 OnModelCreating 中,我调用了基础构造函数,以避免出现类似 "'IdentityUserLogin' 需要定义主键" 的错误。
 protected override void OnModelCreating(ModelBuilder modelBuilder) {
     base.OnModelCreating(modelBuilder);
 }
  1. 如果这是一个已创建的项目,那么StringConnection应该已经存在,如果不存在,请添加它。

  2. 在Startup.cs文件中,在ConfigureServices方法中配置Identity服务。


public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BookStoresDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BookStoreDB")));

    services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.Password.RequireDigit = true;
        options.Password.RequiredLength = 5;
    
    }).AddEntityFrameworkStores<BookStoresDBContext>()
    .AddDefaultTokenProviders();

}

  1. You can configure the Authetication service too

    services.AddAuthentication(auth =>
    {
        auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options => {
        options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            RequireExpirationTime = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Your key to encrypt"))
        };
    });
    
  2. Then run the migration from the Package Manager Console

Add-Migration InitDb
  1. 在迁移文件中,删除所有已经存在于数据库中的表的 migrationBuilder.CreateTable 代码块。

  2. 从程序包管理控制台更新数据库。

Update-Database
  1. 然后您将在数据库中看到身份表

enter image description here

希望这对您有所帮助。


像我这样需要“补习”帮助的人,给出建议:不要使用Scaffold-DbContext/dotnet ef dbcontext scaffold遇到现有的'AspNetxxx'表进行操作。你所生成的模型已经包含了 Identity。试试这个练习: 使用模板构建一个基于代码的.NET 6 MVC 应用程序,带有独立账户。进行初始迁移以创建数据库。运行, 注册, 登录/登出。然后删除解决方案中的迁移文件夹和数据库中的迁移表。应用仍能顺利运行。(它还是代码优先吗?)看一下ApplicationDBContext.cs文件。现在开始考虑你的自定义需求。 - Ian W

0

不要忘记添加迁移并更新数据库,否则会为身份验证抛出依赖注入异常。


您的回答目前不够清晰明了。请[编辑]以添加更多细节,这将有助于其他人理解如何回答问题。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

-2

公共类 MyUser : IdentityUser { public virtual MyUserInfo MyUserInfo { get; set; } }

public class MyUserInfo{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
public class MyDbContext : IdentityDbContext<MyUserInfo> //Edited to MyUserInfo
{ 
    public MyDbContext() 
        : base("DefaultConnection") 
    { 
    } 
    public System.Data.Entity.DbSet<MyUserInfo> MyUserInfo { get; set; } 
 } 

获取个人资料信息

当用户登录时,您可以通过以下方式显示个人资料信息: 获取当前已登录的UserId,以便您可以在ASP.NET身份验证系统中查找该用户

var currentUserId = User.Identity.GetUserId(); 

在 ASP.Identity 系统中实例化 UserManager,以便您可以在系统中查找用户。
var manager = new UserManager<MyUser>(new UserStore<MyUser>(new MyDbContext())); 

获取用户对象。
var currentUser = manager.FindById(User.Identity.GetUserId()); 

获取用户的个人资料信息。
currentUser.MyUserInfo.FirstName 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接