【问题标题】:AspNetCore Identity User missing ApplicationUser custom propertiesAspNetCore Identity User 缺少 ApplicationUser 自定义属性
【发布时间】:2019-12-11 06:49:04
【问题描述】:

我创建了一个简单的 AspNetCore(3.0 预览版)Web 应用程序,该应用程序基于具有应用内身份验证的内置模板(遵循基本教程)。

我可以运行我的应用程序,当我尝试访问安全页面时,我需要登录。

我注册并可以按预期登录。我可以在数据库的 AspNetUsers 表中找到我的用户。

我已成功修改 ApplicationUser 以添加 CustomTag (string) 并运行 EF 迁移和更新以将此列添加到 AspNetUsers 表中。我使用 SQL UPDATE AspNetUsers... 命令填充了该列,因此该列现在包含“Hello World!”。

现在我运行我的应用程序,但我没有关于经过身份验证的用户的有用数据,除了他已经过身份验证。

我在控制器操作中放置了一个断点来查看经过身份验证的ApplicationUser,我看到了 IdentityServer4 添加的 13 个声明的身份,但我不知道这与我的用户有什么关系?用户已通过身份验证,但名称为 NULL。该用户没有我的自定义属性“CustomTag”。我找错地方了吗?

大量搜索导致有关如何扩展模型(完成)以及如何运行 EF 迁移(完成)的深入文章。

大量搜索导致有关如何覆盖 IdentityServer4 的代码和 UI 的深入文章,但在我的模板化应用程序中没有这些,所以我不知道应该在哪里修改代码。

谁能告诉我如何让我的ApplicationUser 自定义属性在控制器操作处理程序中可见?

【问题讨论】:

  • 在您的代码中搜索IdentityUser,它应该只作为 AppUser 的基类出现。

标签: c# asp.net-core asp.net-identity identityserver4


【解决方案1】:

如果您想检索有关当前用户的完整详细信息,您可以在控制器操作中使用如下代码:

var user = await _userManager.GetUserAsync(User); //_userManager is an instance of UserManager<TUser>

如果您希望在登录时将声明加载到身份验证 cookie 中,那么您可以创建并注册(通过 IdentityBuilder.AddClaimsPrincipalFactory&lt;TFactory&gt;())您自己的 UserClaimsPrincipalFactory&lt;TUser, TRole&gt; 实现,该实现可以在登录时将您的其他属性添加为声明,这意味着您不必访问数据库。

【讨论】:

    【解决方案2】:

    你在这里处理两个不同的事情。身份是一个用户管理系统。它独立于 ASP.NET Core 中的身份验证/授权中间件(可以使用或不使用 Identity)。

    当您进行身份验证时,会创建一个 ClaimsPrincipal。实体框架身份提供程序根据数据库中AspNetUsers 表中的内容填充一些声明,但仅填充它本质上知道的内容。它显然没有您添加的自定义属性的内置知识,因此不包括在内。 Identity Server 只是充当一个集中的身份提供者,创建此主体,然后将 发送回请求的应用程序。

    总而言之,您在这里处理的不是ApplicationUser,而是与通过身份验证创建的特定主体相关联的声明集合。

    如果需要,您可以随时获取实际关联的ApplicationUser 以获取任何自定义数据:

    var user = await _userManager.FindByIdAsync(User.FindFirstValue(ClaimTypes.NameIdentitifer));
    

    您还可以选择通过从 UserClaimsPrincipalFactory&lt;TUser&gt; 派生并覆盖 CreateAsync 来补充声明集合,以添加来自任何来源(包括数据库)的附加声明。不过,这只适用于 ASP.NET Core。对于 Identity Server,您需要实现一个自定义的IProfileService

    【讨论】:

    • 谢谢@chris-pratt。在我读过的任何教程中都没有提到通过调用 UserManager 方法来获取应用程序用户。他们似乎都停止向应用程序用户类添加属性,好像这就足够了。
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 2013-11-18
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2019-03-04
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多