AspNetCore身份用户缺少ApplicationUser自定义属性

时间:2019-08-02 15:55:24

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

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

我可以运行我的应用,当我尝试进入安全页面时,我需要登录。

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

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

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

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

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

大量搜索导致了有关如何覆盖IdentityServer4的代码和UI的深入文章,但是在我的模板化应用程序中却没有这些内容,因此我对应该在哪里修改代码感到困惑。

谁能指出我要如何在控制器动作处理程序中显示我的ApplicationUser自定义属性的东西?

2 个答案:

答案 0 :(得分:1)

您在这里处理两个独立的问题。身份是一个用户管理系统。它与ASP.NET Core中的身份验证/授权中间件(可以使用或不使用Identity)分开。

进行身份验证时,将创建一个ClaimsPrincipal。实体框架身份提供程序基于数据库AspNetUsers表中的内容来填充某些声明,但仅填充其固有的已知知识。显然,它不了解您添加的自定义属性的内在知识,因此不包括在内。 Identity Server只是充当集中式身份提供者,创建此主体,然后将那个发送回请求的应用程序。

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

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

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

您还可以选择通过从UserClaimsPrincipalFactory<TUser>派生并覆盖CreateAsync来补充索赔收集,以从任何来源(包括数据库)添加其他索赔。但是,那只能直接在ASP.NET Core中起作用。对于Identity Server,您需要实现自定义IProfileService

答案 1 :(得分:0)

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

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

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