IdentityServer4 + Asp.Net Core Identity - 将身份映射到应用程序数据库用户

18
我正在尝试使用Asp.Net Core Identity实现IdentityServer4。 我希望使用IdentityServer4作为API的集中式身份验证/授权点,始终使用相同的身份识别。 因此,想把Asp.Net Core Identity信息存储在SQL数据库中,用作身份库。
问题是如何将集中式身份识别映射到应用程序特定数据上。 我希望在几个应用程序中使用相同身份的用户,但在每个应用程序中,用户具有其他相关实体、角色等。
我阅读了IdentityServer4文档,但没有找到任何与提议结构相关的内容。
据我所理解,您需要将身份ID映射到本地应用程序用户。 像名字之类的基本数据存储在集中式身份库中,应用程序特定数据存储在应用程序特定数据库中。那么,你不会在应用程序特定的数据库中保存名字等基本信息,对吧? 每次需要用户特定数据的请求都会查询身份服务器以获取信息/声明? 注册流程怎么样?
有人有一个清晰的设置结构,可以用来理解整个设置吗? (分离像Asp.Net Identity Provider、IdentityServer4、受保护的Api这样的东西)
3个回答

7
所以你不会在应用程序特定的数据库中保存用户的名字等信息,对吧?是的,用户特定属性应该放在用户配置文件中,并应该保存在IdentityServer的用户存储(数据库)中。应用程序特定用户数据应该存储在应用程序存储中。
每个需要用户特定数据的请求都需要查询身份验证服务器以获取信息/声明吗?不一定,用户特定数据可以作为声明(claims)包含在身份标记(identity token)中。然后将这些声明作为认证票据存储在cookie中。对于每个请求,这些声明(存储在cookie/s中)可以通过控制器的User属性获得。
var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;

您可以存储和查询与用户ID相关的应用程序相关用户数据(sub声明可用作用户ID)。
如果您需要在应用程序中使用大量特定于用户的数据,则将所有内容包含在身份令牌中并不是最佳选择,并且您不太可能需要每个请求都需要这些数据。因此,当您需要额外信息时,可以查询身份服务器的UserInfo端点。只需在身份令牌中包含您需要识别用户的基本信息即可。

那注册流程呢?

注册是完全独立的工作流程,与身份服务器无关。您只需要将用户保存到身份存储中(可能使用asp.net identity)。当然,您可以将注册控制器与身份服务器一起托管,以便与身份相关的内容物理上位于同一台服务器上。您还可以从任何地方(例如,单独的管理UI或涉及电子邮件验证、手动批准等工作流程)将写入IdentityServer用户存储的注册过程。

谢谢解释! - Jazjef

3
为了自定义 Asp.net Core Identity 中存储的内容,您需要使用 services.AddIdentity<ApplicationUser, ApplicationRole>。其中 ApplicationUserApplicationRole 扩展了 IdentityUserIdentityRole。这样,您就可以将任何额外的信息存储在其中。
然后,为了返回额外的信息,您需要创建一个实现了 IProfileService 接口的 ProfileService。通过此服务,您可以向声明令牌添加任何额外信息。
最后,您需要将此服务注册为:
services.AddSingleton<IProfileService, ProfileService>();
builder.AddAspNetIdentity<ApplicationUser>().AddProfileService<ProfileService>();

您可以使用以下方式注册用户并提供额外信息:
var user = new ApplicationUser
            {
                UserName = Username,
                Email = email,
                ExtraInfo1 = "Hello",
                ExtraInfo2 = "World"
            };
await _userManager.CreateAsync(user, "SomePassword");

你觉得混合应用特定数据和身份数据是个好主意吗? - Monsignor
这完全取决于它有多复杂。个人而言,我只是添加了一个外键列。通过该外键,我可以根据需要查询所有其他表。例如,您可以在ApplicationUser中添加一个名为MemberId的列,它可以引用到您的Members表。然后,您可以创建您的应用程序所需的所有复杂表结构。 - Ahmet

1
使用OpenId时,用户会有一组默认的声明与其关联。因此,任何客户端应用程序都可以访问这些声明。请确保每个客户端都分配了openid和profile范围。否则,客户端应用程序将无法访问用户的基本详细信息。
在Asp.Net Core应用程序中,您可以使用User属性在控制器中访问这些声明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接