我正在尝试使用Asp.Net核心身份实现IdentityServer4 . 我想使用IdentityServer4作为使用始终相同标识的API的集中身份验证/授权点 . 因此,我们的想法是将Asp.Net核心标识内容存储在充当身份存储库的SQL数据库中 .
现在的问题是如何将集中身份映射到特定于应用程序的数据 . 我想在多个应用程序中使用相同的身份用户,但在每个应用程序中,用户都有其他相关实体,角色等 .
我阅读了IdentityServer4的文档,但找不到与建议的结构相关的任何内容 .
据我所知,您以某种方式将身份ID映射到本地应用程序用户 . 诸如firstname等的基本数据存储在集中式身份存储中,并且应用程序特定数据存储在应用程序特定数据库中 . 所以你不会在应用程序特定的数据库中保存名字等吗?在您需要的每个请求中,用户特定数据将查询身份服务器以获取信息/声明?注册流程怎么样?
有没有人有一个清晰的结构设置,可用于了解整个设置? (与Asp.Net Identity Provider,IdentityServer4,Protected Api等分离 . )
3 回答
要自定义您在Asp.net Core Identity中存储的内容,您需要使用
services.AddIdentity<ApplicationUser, ApplicationRole>
.ApplicationUser
和ApplicationRole
正在扩展IdentityUser
和IdentityRole
. 这样您就可以存储任何您想要的额外信息 .然后返回创建
ProfileService
所需的额外信息,以实现IProfileService
. 使用此服务,您可以添加任何额外信息来声明令牌 .您需要将此服务注册为
您可以向用户注册以下额外信息:
是,用户特定属性应进入用户配置文件,并应保存在IdentityServer的用户存储(数据库)中 . 应用程序特定的用户数据应存储在应用程序商店中 .
不一定,用户特定数据可以作为声明包括在身份令牌中 . 然后,声明将作为身份验证票据存储在cookie中 . 对于每个请求,这些声明(存储在cookie / s中)可通过控制器的User属性获得
您可以存储和查询针对用户ID存储的应用程序相关用户数据(
sub
claim可以用作用户ID) .如果您在应用程序中需要大量特定于用户的数据,那么将所有内容都包含在identity-token中并不是最佳选择,并且您不太可能需要为每个请求提供这些数据 . 因此,当您需要额外信息时,您可以查询身份服务器的UserInfo endpoints . 只需包含识别身份令牌中用户所需的基本信息 .
注册是一个完全独立的工作流程,不涉及身份服务器 . 您只需要将用户保存到标识存储(可能使用asp.net标识) . 当然,您可以将注册控制器与身份服务器一起托管,以便身份相关的东西在物理上位于同一台服务器上 . 您也可以从托管注册过程的任何位置(例如,单独的管理UI,或来自涉及电子邮件验证,手动审批等的工作流程)写入IdentityServer用户存储 .
使用OpenId,您可以使用与用户关联的默认声明集 . 因此,任何客户端应用程序都可以访确保每个客户端都分配了 openid 和 profile 范围 . 否则客户端应用程序无法访问用户的基本详细信息 .
在Asp.Net Core应用程序中,您可以使用User属性在控制器中访问这些声明 .