【问题标题】:Using Asp.Net Identity DataBase first approach使用 Asp.Net Identity Database 第一种方法
【发布时间】:2013-12-18 21:03:18
【问题描述】:

我需要将 Asp.Net 最新的 MVC 版本与 现有 数据库集成,该数据库有一个附加列 String Address 到表 dbo.AspNetUsers

我需要创建一个实例ApplicationUser,它具有属性地址。

知道怎么做吗?

【问题讨论】:

标签: c# asp.net-mvc entity-framework identity


【解决方案1】:

一个适合我的可能解决方案,基本上我能够将 Asp.Net 身份用户配置文件与现有数据库集成。

获取 Asp.Identity 表:

  • 使用身份验证个人用户帐户创建 MVC 项目
  • 打开 Web.config 中 DefaultConnection 下列出的 DB。它将被称为 (aspnet-[timestamp] 或类似的东西。)
  • 使用 SQL Server Management Studio 编写数据库表脚本(为 mdc 附加数据库)。

或者使用http://identity.codeplex.com/之类的东西

与您现有的数据库集成:

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

现在您的数据库中有 Asp.Identity 表,应用程序中有 ER 模型。

Asp.Identity Profile 添加新属性:

  • 启用实体框架代码优先数据库迁移,只需在 VS 中进入工具“包管理器控制台”下,
  • 执行命令“Enable-Migrations”;启用数据库迁移后,我们可以继续为 UserProfile 添加新属性

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


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

添加新迁移

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

    添加迁移“YouMigrationName”

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

Update-Database

现在,所有新属性都将变成同一个数据库表中的表字段。

希望对大家有所帮助,如果有更好的想法请告诉我。

【讨论】:

  • 其实这对我不起作用。我启用了迁移,添加了新属性,添加了新迁移,但是当我尝试“更新数据库”时,它显示“数据库中已经有一个名为 'AspNetRoles' 的对象。”。看来,它并没有更新数据库,而是尝试重新创建它。
  • 我可以知道为什么所有的asp.net mvc都使用localdb作为默认的认证数据库吗?
  • 如果迁移是数据库优先的方法,为什么要使用迁移?我的理解是迁移用于代码优先的方法来将代码更改应用于数据库
  • 实际在哪里找到“(aspnet-[timestamp] 或类似的东西。)”?它是否存在于项目文件夹中?
  • 为什么我发现的关于实体表的每个数据库优先讨论都涉及代码优先?
【解决方案2】:

我已成功通过 Database First 与 Identity Framework 2.0 集成现有数据库。我在 here 上写了一篇博文,它使用了 ASP.NET MVC 5、Identity Framework 2.0 和 Visual Studio 2013 Update 2 RTM 的 SPA 模板。

我希望这对任何人的旅程有所帮助,因为它包含一些我必须自己弄清楚的地方没有列出的要点。

【讨论】:

  • 嗨,Daniel,尝试关注您出色的博客条目(谢谢),但数据库 (localdb) 必须存在于单独的程序集中。无法让它工作。例如,如何从 web 应用程序 web.config - |DataDirectory| 指向另一个程序集中的数据库没有任何意义。有什么例子吗?
  • @Jay 看看stackoverflow.com/questions/14213943/…,如果这能回答您的问题,请告诉我。谢谢。
  • @Daniel 谢谢,从某种意义上说,我现在可以在位于单独的“数据”程序集中的数据库中注册用户。但是,web.config 连接字符串通过显式使用它的路径来引用数据程序集中的这个 localdb mdf:attachdbfilename=C:\Work\test\delete\testIdentity\SS.Data.SqlLocalDb\bin\Debug\App_Data\SSLocalDb .mdf。有没有更好的方法用相对路径来引用它?感谢您的帮助,太好了。
  • @Jay 你会想要使用 |DataDirectory|正如您在另一条评论中提到的那样。在curtismitchell.wordpress.com/2011/06/21/… 找到的文章更详细地讨论了这一点。此外,这篇很棒的 Stack Overflow 文章进一步讨论了它:stackoverflow.com/questions/1409358/…
  • @Daniel 谢谢,太棒了。
【解决方案3】:

看看 GitHub 上的这些项目:

其中包括:

  • ASP.NET Identity 2.0 的 SQL 数据库项目模板
  • 实体框架数据库优先提供者
  • 源代码和示例

【讨论】:

  • 任何人都获得了有关如何使用github.com/kriasoft/AspNet.Identity 的任何其他资源,因为它的文档并没有说太多,如果我不是从头开始怎么办。我只是想将我的身份上下文链接到我的数据库第一个上下文/。
  • @Zapnologica,嗯.. 它更适合数据库优先的方法,您可以根据实际的数据库模式生成 EF DbContext / Model。
  • 那么不能先用db吗?我能想到的唯一方法是重新实现所有商店并使用我自己的dbContext 指向我的数据库第一个模型?
  • @Zapnologica ASP.NET Server Template 项目包含一个完整的 ASP.NET 身份解决方案示例和 EF DbFirst 开发方法。
【解决方案4】:

我最近遇到了同样的问题。我有一个使用 DBFirst 方法创建的应用程序,我需要添加身份。这就是我所做的。

  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 上配置身份服务


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. 您也可以配置身份验证服务

    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. 然后从包管理器控制台运行迁移

Add-Migration InitDb
  1. 在迁移文件中,删除数据库中已有表的所有 migrationBuilder.CreateTable

  2. 从包管理器控制台更新数据库

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

我希望它有用?

【讨论】:

  • 对像我这样需要补救帮助的人的建议:不要Scaffold-DbContext / dotnet ef dbcontext scaffold 反对您现有的“AspNetxxx”表。您将生成的模型已经带有 Identity。试试这个练习:使用个人帐户从模板构建代码优先的 .NET 6 MVC 应用程序。进行初始迁移以创建数据库。运行、注册、登录/退出。然后删除解决方案中的迁移文件夹和数据库中的迁移表。该应用程序仍然可以正常工作。 (它仍然是代码优先吗?)看看ApplicationDBContext.cs。现在开始考虑您的自定义设置。
【解决方案5】:

不要忘记添加迁移和更新数据库。否则,它会为身份引发依赖注入异常。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案6】:

公共类 MyUser : IdentityUser { 公共虚拟 MyUserInfo MyUserInfo { 获取;放; } }

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 Identity系统中查找用户

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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2017-01-12
    • 2022-01-20
    • 2014-04-23
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多