gpt4 book ai didi

c# - 用现有的数据库信息替换默认的 IdentityDbContext

转载 作者:行者123 更新时间:2023-11-30 19:59:03 25 4
gpt4 key购买 nike

我需要向已有事件用户数据库的系统添加 ASP.NET Web API。

根据我使用内置于 asp.net 中的默认标识的经验,它通常使用代码优先方法从头开始创建表。这显然不是我正在寻找的方法。

我如何才能将身份模型指向我当前的数据库而不是创建一个新数据库?

我好像找不到像样的教程或如何在线?

我假设我必须在身份包中的某个地方实现一个接口(interface),以便我提供正常操作所需的最少字段。

我想为用户角色和用户身份执行此操作。

我是否先将当前数据库导入代码?

{编辑}

这是我的表格的链接: ERD

最佳答案

可以通过覆盖 OnModelCreating 事件来映射 ASP.NET Identity 对象和属性。这看起来像-

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

var user = modelBuilder.Entity<IdentityUser>().HasKey(u => u.Id).ToTable("User", "Users"); //Specify our our own table names instead of the defaults

user.Property(iu => iu.Id).HasColumnName("Id");
user.Property(iu => iu.UserName).HasColumnName("UserName");
user.Property(iu => iu.Email).HasColumnName("EmailAddress").HasMaxLength(254).IsRequired();
user.Property(iu => iu.IsConfirmed).HasColumnName("EmailConfirmed");
user.Property(iu => iu.PasswordHash).HasColumnName("PasswordHash");
user.Property(iu => iu.SecurityStamp).HasColumnName("SecurityStamp");

user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
user.Property(u => u.UserName).IsRequired();
...

通过为每个实体使用“ToTable”和为每个属性使用“HasColumnName”,您应该能够映射到您自己的模式。

明显的问题是,这将只允许您更改列名和表名,而不能更改列类型。

您可以扩展 IdentityUser 类以添加与模式中的其他数据库列相匹配的新属性,并且您可以更改用户和角色的主键类型(参见 http://aspnet.codeplex.com/SourceControl/latest#Samples/Identity/ChangePK/readme.txt),但核心列类型和信息将需要相同。这很可能是密码散列列的问题,在 ASP.NET Identity 的情况下,该列实际上同时包含散列和盐。

如果您有现有的用户凭证,您可能需要转换它们 - 从 SQL Membership 执行此操作的过程在 http://www.asp.net/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity 中给出。并使用 https://aspnet.codeplex.com/SourceControl/latest#Samples/Identity/SQLMembership-Identity-OWIN/Migrations.sql 处的脚本

过程的关键点是——

The passwords of the users of the application are encrypted and stored in the database. The crypto algorithm used in SQL membership is different from the one in the new Identity system. To reuse old passwords we need to selectively decrypt passwords when old users log in using the SQL memberships algorithm while using the crypto algorithm in Identity for the new users.

可能也可以在使用以前的成员算法成功登录后暂时保留密码,然后使用明文字符串将密码添加到使用 ASP 的新 ASP.NET Identity 密码列中.NET Identity hashing 和用户管理器机制 - 但在这种情况下,您应该非常小心地传递纯文本凭据。您还应该在成功迁移后销毁先前系统的(更弱散列的)凭据,以防将来发生违规(并且以防自从迁移到更强大的散列 ASP.NET 身份列以来凭据没有更改)。

关于c# - 用现有的数据库信息替换默认的 IdentityDbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com