将 ASP.Net Identity 表链接到用户详细信息表

2024-04-29

我正在尝试将我的身份用户表链接到我创建的用于跟踪其他用户信息的用户详细信息表。该用户详细信息表称为 UserProfile。

我发现了这个链接,但它在 .NET Core 2.1 中不起作用:将 ASP.NET Identity 用户链接到用户详细信息表 https://stackoverflow.com/questions/33197402/link-asp-net-identity-users-to-user-detail-table

这是我目前拥有的:

public class ApplicationUser : IdentityUser
{

    [Key]
    public override string Id { get; set; }

    [ForeignKey("Id")]
    public virtual UserProfile UserProfile { get; set; }

}

[Table("UserProfile")]
public class UserProfile
{
    [Key, ForeignKey("User")]
    public string UserId { get; set; } // UserId (Primary key) 
    public string UserName { get; set; } // UserName 
    public string FirstName { get; set; } // FirstName
    public string LastName { get; set; } // LastName

    //[ForeignKey("Id")]
    public virtual ApplicationUser User { get; set; }
}

但是,在代码的其他地方我调用:

var user = await _userMgr.FindByNameAsync(model.UserName);

并且 user.UserProfile 为空。

我尝试了很多数据注释甚至Fluent api的组合都无济于事。

   modelBuilder.Entity<ApplicationUser>()
       .HasOne(c => c.UserProfile)
       .WithOne(t => t.User)
       .HasForeignKey<UserProfile>(b => b.UserId);

我还尝试打开延迟加载,但这甚至无法加载该属性。

有谁知道如何在.Net Core 2.1 中做到这一点?

Thanks


你的主要问题很简单UserManager没有包含相关实体的功能,例如您的UserProfile。因此,您有两种选择:

  1. 直接使用您的上下文。然后你就可以急切地加载你的UserProfile随着ApplicationUser例如,只需对数据库进行一次查询:

    var user = await _context.Users.Include(x => x.UserProfile).SingleOrDefaultAsync(x => x.UserName ==  model.UserName);
    
  2. 您可以显式加载相关的UserProfile反而。不过,这将导致额外的查询,总共有两个查询:一个用于获取用户,另一个用于获取相关的个人资料:

    await _context.Entry(user).Reference(x => x.UserProfile).LoadAsync();
    

然而,坦率地说,你不应该UserProfile根本不。 ASP.NET Identity 与 ASP.NET Membership 不同。对于后者,你必须有一个单独的UserProfile因为Membership中的“用户”是不可扩展的。在身份中,用户is可扩展,因此如果您需要其他配置文件信息,只需将其添加到类中即可:

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

请注意,我在这里也删除了很多内容。重写没有意义Id然后让它自动实现。此外,您显然不需要UserName财产来自UserProfile因为IdentityUser已经有了,这当然意味着你的ApplicationUser也有。

UPDATE

用户数据的持久化方式并不一定会影响它是否可以作为声明。换句话说,您不必将数据真正保存为声明才能将其作为声明访问。只是派生自UserClaimsPrincipalFactory<TUser>, 覆盖CreateAsync,然后将其注册到范围内的服务集合中。

public class MyClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public MyClaimsPrincipalFactory(UserManager<TUser> userManager, IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
    {
    }

    public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
    {
        var principal = await base.CreateAsync(user);
        ((ClaimsIdentity)principal.Identity).AddClaims(new[]
        {
            new Claim(ClaimTypes.GivenName, user.FirstName),
            new Claim(ClaimTypes.Surname, user.LastName),
            // etc.
        });

        return principal;
    }
}

Then in ConfigureServices:

services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, MyClaimsPrincipalFactory>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ASP.Net Identity 表链接到用户详细信息表 的相关文章

  • 没有端点在 net.pipe://localhost/ 上监听

    我有两个 WCF 服务托管在 Windows Server 2003 计算机上的单个 Windows 服务中 如果 Windows 服务需要访问任一 WCF 服务 例如发生定时事件时 它将使用公开的五个命名管道端点之一 不同的服务协定 该服
  • .net Core:如何从 C# 代码传递参数并运行 Azure 数据工厂管道?

    我在用Microsoft Azure 管理 DataFactories net 核心包 我使用以下代码来获取访问 C net core 中的 azure 数据工厂管道所需的令牌 public static void RunDataFacto
  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • 如何在 C# 中向类、方法、属性等添加文档工具提示?

    不确定我的说法是否正确 但我想开始向我的类 方法 属性等添加一些文档 我know这可能是非常明显的 但我从未真正学会过 我不知道从哪里开始 只是为了澄清 每当您滚动某个类 或方法 属性等 时 它都会在 Visual Studio 中显示一个
  • 有没有基于 WPF 的 Markdown 渲染器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有基于 WPF 的应用程序 我们有单独的字符串存储库 其中的文本在网络中进行编辑 在我们的 WPF
  • 使用 ASP.Net vNext 发送邮件

    一般来说 在传统的 ASP Net 和 Net 中 发送邮件是通过System Net Mail所在的类System dll 现在有了KRE vNext好像就没有了System Net Mail作为一个单独的包 参考 net453 框架在p
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 记录共享和映射的诊断上下文

    据我所知 其他人做了什么来解决 Commons Logging 项目 针对 NET 和 Java 不支持映射或嵌套诊断上下文这一事实 执行摘要 我们选择直接使用实现者日志框架 在我们的例子中为 log4j 长答案 您是否需要一个抽象日志框架
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 如何在 Windows CE 中使用 VB.Net 访问条码扫描仪

    最近我被要求开发一个应用程序摩托罗拉 MK4000 http www motorola com Business US EN Business Product and Services Micro Kiosks Micro Kiosks M
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 将 dll 注册到 GAC 或从 ASP.NET 中的 bin 文件夹引用它们是否更好

    如果答案是 视情况而定 您能否提供一个简短的解释 GAC 旨在包含以下组件跨多个应用程序共享 如果是这种情况 您应该对程序集进行强命名并向 GAC 注册 如果不是 请将程序集保留为私有程序集并将其作为项目 dll 引用进行引用 PS 没有真
  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐