C# Asp.Net标识自定义AspNetUser主id字段值?

C# Asp.Net标识自定义AspNetUser主id字段值?,c#,asp.net-core,asp.net-identity,identityserver4,identity,C#,Asp.net Core,Asp.net Identity,Identityserver4,Identity,我想提供自己的主ID生成逻辑,以便为主ID字段提供值。 我知道,可以更改类型,但我想控制Id创建逻辑 有没有办法做到这一点 谢谢您几乎可以肯定地扩展UserManager以覆盖必要的功能并控制它。它们提供了一个AddUserManager()注册帮助程序,允许您在注册ASP.Net标识时轻松提供自己的实现 您可以在此处找到源代码: 另外,使用ASP.Net Identity也没有硬性的IdentityServer 4要求-如果它不能满足您的需要,那么您可以自由地实现它。您可以将AspNetUse

我想提供自己的主ID生成逻辑,以便为主ID字段提供值。 我知道,可以更改类型,但我想控制Id创建逻辑

有没有办法做到这一点


谢谢

您几乎可以肯定地扩展UserManager以覆盖必要的功能并控制它。它们提供了一个
AddUserManager()
注册帮助程序,允许您在注册ASP.Net标识时轻松提供自己的实现

您可以在此处找到源代码:


另外,使用ASP.Net Identity也没有硬性的
IdentityServer 4
要求-如果它不能满足您的需要,那么您可以自由地实现它。

您可以将
AspNetUser
的主键
Id
设置为,然后在创建用户时添加自定义Id值

在您的环境中:

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUser>().Property(u => u.Id).ValueGeneratedNever();
    }
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity().Property(u=>u.Id).ValueGeneratedNever();
}

添加迁移和更新数据库,然后您可以为主Id生成自己的值。

只需覆盖Id字段

public class ApplicationUser : IdentityUser
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public override string Id
    {
        get { return base.Id; }
        set { base.Id = value; }
    }
}

var user = new ApplicationUser
{
    Id = "CustomId",
    UserName = "user",
    Email = "user@email.com"
}

为什么要这样做?我们在旧应用程序中有现有用户,希望将所有用户移动到新应用程序中,并且不希望更改Id字段,因为对现有主Id字段值有很多依赖性。也许您可以更具体一些,因为这并不能解释为什么需要更改Id创建逻辑。我还想知道这些依赖关系的本质是什么。无论如何,Id字段的唯一要求是必须是唯一的。那么,为什么不移动遗留用户(使用原始密钥作为Id)并像往常一样创建新用户呢?我认为没有复制的机会。但我宁愿保留当前Id字段和逻辑不变,没有进一步的依赖关系,并添加一个包含“旧”Id的字段。如果必须在声明中设置该值,请更改令牌创建的逻辑。谢谢Ruard。我还建议团队添加另一个包含旧id的字段。