我基于带有应用程序内身份验证的内置模板启动了一个简单的AspNetCore(3.0预览版)Web应用程序(遵循基本教程)。
我可以运行我的应用,当我尝试进入安全页面时,我需要登录。
我注册并可以按预期登录。我可以在数据库的AspNetUsers表中找到我的用户。
我成功修改了ApplicationUser
以添加CustomTag (string)
并运行EF迁移和更新,以将该列添加到AspNetUsers
表中。我使用SQL UPDATE AspNetUsers...
命令填充了该列,因此该列现在包含“ Hello World!”。
现在,我运行我的应用程序,但是除了经过身份验证的用户外,我没有关于经过身份验证的用户的有用数据。
我在控制器操作中设置了一个断点,以查看经过身份验证的ApplicationUser
,并且看到IdentityServer4添加的具有13个声明的身份,但是我不知道这与我的用户有何关系?用户已通过身份验证,但名称为NULL。该用户没有我的自定义属性“ CustomTag”。我看错地方了吗?
大量搜索引出了有关如何扩展模型(完成)以及如何运行EF迁移(完成)的深入文章。
大量搜索导致了有关如何覆盖IdentityServer4的代码和UI的深入文章,但是在我的模板化应用程序中却没有这些内容,因此我对应该在哪里修改代码感到困惑。
谁能指出我要如何在控制器动作处理程序中显示我的ApplicationUser
自定义属性的东西?
答案 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>
实现,该实现可以将其他属性添加为声明登录时,这意味着您不必访问数据库。