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