首页 文章

IdentityServer4 Asp.Net核心标识 - 将标识映射到应用程序数据库用户

提问于
浏览
8

我正在尝试使用Asp.Net核心身份实现IdentityServer4 . 我想使用IdentityServer4作为使用始终相同标识的API的集中身份验证/授权点 . 因此,我们的想法是将Asp.Net核心标识内容存储在充当身份存储库的SQL数据库中 .

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

我阅读了IdentityServer4的文档,但找不到与建议的结构相关的任何内容 .

据我所知,您以某种方式将身份ID映射到本地应用程序用户 . 诸如firstname等的基本数据存储在集中式身份存储中,并且应用程序特定数据存储在应用程序特定数据库中 . 所以你不会在应用程序特定的数据库中保存名字等吗?在您需要的每个请求中,用户特定数据将查询身份服务器以获取信息/声明?注册流程怎么样?

有没有人有一个清晰的结构设置,可用于了解整个设置? (与Asp.Net Identity Provider,IdentityServer4,Protected Api等分离 . )

3 回答

  • 0

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

    然后返回创建 ProfileService 所需的额外信息,以实现 IProfileService . 使用此服务,您可以添加任何额外信息来声明令牌 .

    您需要将此服务注册为

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

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

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

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

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

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

    您可以存储和查询针对用户ID存储的应用程序相关用户数据( sub claim可以用作用户ID) .

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

    注册过程怎么样?

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

  • 1

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

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

相关问题