【问题标题】:IdentityServer4 + Asp.Net Core Identity - Map Identity to application database userIdentityServer4 + Asp.Net Core Identity - 将身份映射到应用程序数据库用户
【发布时间】:2018-02-12 17:49:04
【问题描述】:

我正在尝试使用 Asp.Net Core Identity 实现 IdentityServer4。 我想将 IdentityServer4 用作始终使用相同身份的 API 的集中式身份验证/授权点。 所以我们的想法是将 Asp.Net Core Identity 存储在一个 SQL 数据库中,用作身份存储。

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

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

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

有没有人有一个清晰的结构设置可以用来理解整个设置? (如 Asp.Net Identity Provider、IdentityServer4、Protected Api 之类的分离。)

【问题讨论】:

    标签: asp.net-core identityserver4 asp.net-core-identity asp.net-authorization


    【解决方案1】:

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

    然后要返回您需要创建一个实现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");
    

    【讨论】:

    • 您认为混合应用特定数据和身份数据是个好主意吗?
    • 这一切都取决于它会变得多么复杂。就个人而言,我只是添加一个带有外键的列。使用该外键,我可以根据需要查询所有其他表。例如,您可以向 ApplicationUser 添加一个名为 MemberId 的列,这可以引用您的 Members 表。您可以从那里创建应用所需的所有复杂表结构。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      所以你不会在应用程序特定的数据库中保存名字等 对吧?

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

      在您需要用户特定数据的每个请求中,都会查询 身份服务器来获取信息/声明?

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

      var identity = (ClaimsIdentity)User.Identity;
      IEnumerable<Claim> claims = identity.Claims;
      

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

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

      注册流程如何?

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

      【讨论】:

      • 感谢您的解释!
      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多