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

IdentityServer4 + Asp.Net Core Identity - Map Identity to application database user

我正在尝试使用 Asp.Net Core Identity 实现 IdentityServer4。 我想将 IdentityServer4 用作始终使用相同身份的 API 的集中 authentication/authorization 点。 因此,我们的想法是将 Asp.Net Core Identity 内容存储在用作身份存储的 SQL 数据库中。

现在的问题是如何将集中身份映射到应用程序特定数据。 我想在多个应用程序中使用相同的身份用户,但在每个应用程序中,用户都有其他相关实体、角色等。

我通读了 IdentityServer4 的文档,但找不到任何与提议的结构相关的内容。

据我了解,您以某种方式将身份 ID 映射到您的本地应用程序用户。 名字等基本数据存储在集中式身份存储中,应用程序特定数据存储在应用程序特定数据库中。所以你不会在应用程序特定的数据库中保存名字等,对吗? 在您需要用户特定数据的每个请求中,将查询身份服务器以获取 information/claims? 注册流程如何?

有没有人有一个清晰的结构设置可以用来理解整个设置? (像 Asp.Net 身份提供者、IdentityServer4、受保护 Api 这样的分隔。)

要自定义存储在 Asp.net Core Identity 中的内容,您需要使用 services.AddIdentity<ApplicationUser, ApplicationRole>ApplicationUserApplicationRole 扩展了 IdentityUserIdentityRole。这样你就可以让它存储你想要的任何额外信息。

然后 return 您需要创建一个实现 IProfileServiceProfileService 的额外信息。使用此服务,您可以添加任何额外信息来领取令牌。

您需要将此服务注册为

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");

有了 OpenId,您就有了一组与用户关联的默认声明。因此任何客户端应用程序都可以访问这些声明。确保每个客户端都分配了 openidprofile 范围。否则客户端应用程序无法访问用户的基本详细信息。

在 Asp.Net 核心应用程序中,您可以使用用户 属性 在控制器中访问这些声明。

So you would not save firstname etc in the application specific db right?

是的,用户特定的属性应该进入用户配置文件,并且应该保存在 IdentityServer 的用户存储(数据库)中。应用程序特定的用户数据应存储在应用程序商店中。

In the every request where you need user specific data will query the identity server to get information/claims?

不一定,用户特定数据可以作为声明包含在身份令牌中。然后声明将作为身份验证票证存储在 cookie 中。对于每个请求,这些声明(存储在 cookie/s 中)可通过控制器

的用户 属性 获得
var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;

您可以存储和查询针对用户 Id 存储的与应用程序相关的用户数据(sub 声明可以用作用户 Id)。

如果您在应用程序中需要大量特定于用户的数据,那么将所有内容都包含在身份令牌中并不是最佳选择,而且您不太可能每次请求都需要这些数据。因此,当您需要额外信息时,您可以查询身份服务器的 UserInfo 端点。只需在身份令牌中包含识别用户所需的基本信息。

What about the registration process?

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